1. 程式人生 > >python 按圖形列印二叉樹

python 按圖形列印二叉樹

需求:

python程式碼實現
1. 按層列印二叉樹
2. 需要列印二叉樹層與層之間的斜線
3. 結點的下一層如果沒有子節點,以‘N’代替

方法:

  1. 使用namedtuple表示二叉樹
  2. 使用StringIO方法,遍歷時寫入結果,最後打印出結果
  3. 列印結點值時,如果為空,StringIO()寫入‘N ’
  4. 遞迴獲取樹的深度
  5. 將遍歷樹時候每層的node當做list元素存入list中
  6. 根據樹的深度設定每層node應該pad的空格數量:
    2 **(深度-1)-1
  7. 列印每層之間的斜線,需處理:
    • 每兩層之間的斜線應有 “2 **(深度-1)”層
    • 每層的左斜線與右斜線之間的空格數量有變化,每深一層加2

python程式碼:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from collections import namedtuple
from io import StringIO
import math

# define the node structure
Node = namedtuple('Node', ['data', 'left', 'right'])
# initialize the tree
tree = Node(1,
            Node(2,
                 Node(4,
                      Node(7
, None, None), None), Node(5, None, None)), Node(3, Node(6, Node(8, None, None), Node(9, None, None)), None)) class Queue(object): def __init__(self): self.queue = [] def
enqueue(self, b):
self.queue.insert(0, b) def dequeue(self): return self.queue.pop() def isEmpty(self): return self.queue == [] def getheight(node): if not node: return 0 else: return max(getheight(node.left), getheight(node.right)) + 1 def add_padding(str, pad_length_value): str = str.strip() return str.center(pad_length_value, ' ') # sotre node , space and slashes in list first, then print out def pretty_print(tree): output = StringIO() pretty_output = StringIO() current_level = Queue() next_level = Queue() current_level.enqueue(tree) depth = 0 # get the depth of current tree # get the tree node data and store in list if tree: while not current_level.isEmpty(): current_node = current_level.dequeue() output.write('%s ' % current_node.data if current_node else 'N ') next_level.enqueue( current_node.left if current_node else current_node) next_level.enqueue( current_node.right if current_node else current_node) if current_level.isEmpty(): if sum([i is not None for i in next_level.queue] ): # if next level has node current_level, next_level = next_level, current_level depth = depth + 1 output.write('\n') print('the tree print level by level is :') print(output.getvalue()) print("current tree's depth is %i" % (depth+1)) # add space to each node output.seek(0) pad_length = 3 keys = [] spaces = int(math.pow(2, depth)) while spaces > 0: skip_start = spaces * pad_length skip_mid = (2 * spaces - 1) * pad_length key_start_spacing = ' ' * skip_start key_mid_spacing = ' ' * skip_mid keys = output.readline().split(' ') # read one level to parse padded_keys = (add_padding(key, pad_length) for key in keys) padded_str = key_mid_spacing.join(padded_keys) complete_str = ''.join([key_start_spacing, padded_str]) pretty_output.write(complete_str) # add space and slashes to middle layer slashes_depth = spaces print('current slashes depth im_resize:') print(spaces) print("current levle's list is:") print(keys) spaces = spaces // 2 if spaces > 0: pretty_output.write('\n') # print '\n' each level cnt = 0 while cnt < slashes_depth: inter_symbol_spacing = ' ' * (pad_length + 2 * cnt) symbol = ''.join(['/', inter_symbol_spacing, '\\']) symbol_start_spacing = ' ' * (skip_start-cnt-1) symbol_mid_spacing = ' ' * (skip_mid-2*(cnt+1)) pretty_output.write(''.join([symbol_start_spacing, symbol])) for i in keys[1:-1]: pretty_output.write(''.join([symbol_mid_spacing, symbol])) pretty_output.write('\n') cnt = cnt + 1 print(pretty_output.getvalue()) if __name__ == '__main__': pretty_print(tree)

測試用的tree如下:

這裡寫圖片描述

執行結果如下:

這裡寫圖片描述
這裡寫圖片描述

相關推薦

python 圖形列印

需求: python程式碼實現 1. 按層列印二叉樹 2. 需要列印二叉樹層與層之間的斜線 3. 結點的下一層如果沒有子節點,以‘N’代替 方法: 使用namedtuple表示二叉樹 使用StringIO方法,遍歷時寫入結果,最後打印出

列印,每行後面回車

#include<iostream> #include<queue> using namespace std; struct Node { Node* left;

Java 深度列印

二叉樹的列印程式需要用到佇列來完成,在Java中使用LinkedList類即可。具體的程式碼如下所示: public class TreeNode { private int value; private TreeNode ltr; private TreeNode

劍指offer系列——之字形順序列印,把列印成多行,序列化二

按之字形順序列印二叉樹 題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 解題思路: 法一: 需要兩個棧。我們在列印某一行節點時,把下一層的子節點儲存到相應的棧裡。 如果

劍指Offer 59. 之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 題目地址 https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0?tpId=

演算法題(三十七):之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 分析 用兩個棧來實現,先把根結點放入s1,當行數為偶數時,s2從左到右放結點;當行數為奇數時,s1從右到左放結點; 筆者用j

劍指offer 59. 之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路: 與逐層列印二叉樹一樣,只是多了層數判定,依據層數做判定輸出。 按之字形順序列印二叉樹需要兩個棧。我們在列印某一行

【劍指offer】之字形列印python

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 在上一篇部落格中:層次遍歷,每一層在一行輸出中,只需要將奇數行的result反轉一下就行了 另外一種方法就是,需要反轉佇列的結果,

劍指offer學習筆記(Python)--從上往下列印

題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 思路 這是一個二叉樹的廣度優先遍歷的問題,可以用佇列來實現。建立兩個陣列,一個用來存放佇列,一個用來存放要列印的結點的值 實現 更多方法:https://www.nowcoder.com/ques

(劍指offer)之字形順序列印

時間限制:1秒 空間限制:32768K 熱度指數:124380 題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路 BFS。每次取出佇列中所有節點,也就是樹的一層 i

之字形順序列印

題目 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路 思路主要就是如何把層序遍歷序列按層分開來,跟前面的直接列印二叉樹每層思路一樣,只是現在要判斷奇

[] 6.69 形狀列印

題目來源:嚴蔚敏《資料結構》C語言版本習題冊 6.69 【題目】6.69 假設以二叉連結串列儲存的二叉樹中,每個結點所含資料元素均為單字母,試編寫演算法,按樹形狀列印二叉樹的演算法。例如:左下二叉樹

【劍指offer】從上往下列印,層次遍歷python

題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 採用佇列的思想,出佇列則列印,然後左節點右節點分別入佇列 注意如果需要兩個不同的列表,一定不能用list = result = []這樣

之字形列印

# -*- coding:utf-8 -*- # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None # self.right = None cl

劍指offer32(1,2,3)--從上往下列印,分行從上往下列印之字形順序列印

從上往下列印二叉樹 題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 思路: 層序遍歷,用到佇列 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;

劍指offer之從上到下列印Python

題目描述 從上往下列印出二叉樹的每個節點,同層節點從左至右列印。 思路:用兩個list,一個用來裝節點,一個用來裝節點的value。對於裝節點的這個list,我們每次彈出最前面的節點,並依次將左節

劍指offer 59:之字順序列印

按之字順序列印二叉樹: 先按層次遍歷,儲存到陣列中,列印的時候,遇到偶數行,反轉列印   #include <iostream> #include <algorithm> #include <vector> using namespace

之字形順序列印 c++實現

題目描述請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。/*struct TreeNode {    int val;    struct TreeNode *left;    s

[劍指offer] 59. 之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推 思路: 用兩個棧或佇列去儲存,用一個變量表示方向,根據不同方向存取順序不同。 class Solu

[演算法]之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路 層次遍歷,在此基礎上加上奇數偶數行判斷。 程式碼 import java.util.ArrayList; import java.