为了便于刷leetcode测试自己写的函数,真实观察经过一些操作后树的变化,
写了以下几个函数:
- FUN1 由数组创建一棵树
- FUN2.3 层次遍历一棵树,以数组的形式返回遍历结果(完全二叉树,空结点-1补全), 用于绘制图形
- FUN3 一棵树的最大深度
- FUN4 打印一棵二叉树图形
# tree.py
"""二叉树数据结构"""
class TreeNode:
def __init__(self, val=-1):
self.val = val
self.left = None
self.right = None
"""FUN1 由数组 创建一棵树"""
def tree_create(arr, index: int):
tnode = None
if index < len(arr):
if arr[index] == null:
return
tnode = TreeNode(arr[index])
tnode.left = tree_create(arr, index * 2 + 1)
tnode.right = tree_create(arr, index * 2 + 2)
return tnode
"""FUN2.3 层次遍历一棵树,以数组的形式返回遍历结果(与原树高度相同的完全二叉树,空结点-1补全), 用于绘制图形"""
def tree_level_complete_binary_tree(root):
if root is None:
return
depth = tree_depth(root)
tree_graph = []
queue = [root]
while queue:
node = queue.pop(0)
tree_graph.append(node.val)
if node.left:
queue.append(node.left)
else:
queue.append(TreeNode())
if node.right:
queue.append(node.right)
else:
queue.append(TreeNode())
tag = True # 全是null
for q in queue:
if q.val != -1:
tag = False
if tag: # 全是null
break
for i in range(len(tree_graph), 2 ** depth - 1):
tree_graph.append(-1)
return tree_graph
"""FUN3 求一棵树的最大深度"""
def tree_depth(root) -> int:
if root is None:
return 0
else:
return max(tree_depth(root.left), tree_depth(root.right)) + 1
"""FUN4 打印一棵二叉树图形"""
def tree_print_graph(root):
depth = tree_depth(root)
tree_graph = tree_level_complete_binary_tree(root)
print(tree_graph)
nodes_val = [[] for i in range(depth)] # 记录每一层的结点
graph = ["" for i in range(depth)]
# 排列好结点的位置
for i in range(depth):
nodes_val[i] = tree_graph[2 ** i - 1: 2 ** (i + 1) - 1]
# print(nodes_val)
for j in range(len(nodes_val[i])):
if nodes_val[i][j] == -1:
nodes_val[i][j] = " "
graph[i] += str(nodes_val[i][j]) + (" " * (2 ** (depth - i + 1) - 1)) # 添加结点之间的间隔,最底层间隔3个“ ”
# print(graph[i])
graph[i] = (" " * ((2 ** (depth - i)) - 2)) + graph[i] # 错开位置,构成树的形状,
# print(graph[i])
# print("###################################################################")
for s in graph:
print(s)
对以上函数测试:
# testTree.py
from tree import *
arr = ['a', 'b', 'c', 'd', null, 'f', 'g', 'h', 'i', null, null, 'l', 'm']
# arr = [0, 1, 2, null, 4, 5, 6, null, null, 9]
# arr = [0, 1, 2, 3, 4, 5, 6]
# arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21]
# arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l']
print('\n' + "FUN1 由数组创建一棵树")
root = tree_create(arr, 0)
print('\n' + "FUN2.3 层次遍历一棵树,以数组的形式返回遍历结果(完全二叉树,空结点-1补全), 用于绘制图形")
print(tree_level_complete_binary_tree(root))
print('\n' + "FUN3 一棵树的最大深度")
print("二叉树的最大深度:", tree_depth(root))
print('\n' + "FUN4 打印一棵二叉树图形")
tree_print_graph(root)