python 按圖形列印二叉樹
需求:
python程式碼實現
1. 按層列印二叉樹
2. 需要列印二叉樹層與層之間的斜線
3. 結點的下一層如果沒有子節點,以‘N’代替
方法:
- 使用namedtuple表示二叉樹
- 使用StringIO方法,遍歷時寫入結果,最後打印出結果
- 列印結點值時,如果為空,StringIO()寫入‘N ’
- 遞迴獲取樹的深度
- 將遍歷樹時候每層的node當做list元素存入list中
- 根據樹的深度設定每層node應該pad的空格數量:
2 **(深度-1)-1 - 列印每層之間的斜線,需處理:
- 每兩層之間的斜線應有 “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.