题目描述:
从上往下打印出二叉树的每个节点,同层节点从左至右打印。例如下图二叉树,依次打印出 [8, 6, 10, 5, 7, 9, 11]
思路:
使用一个容器(列表或者队列)将二叉树的各个节点有序保存起来,具体地,首先将根节点保存进底部,并使用指针指向容器底部,检查指针所指向的节点是否存在左右子节点,如果存在则依次添加进入容器,指针向上移动;否则指针直接向上移动。按照上述规律,指针不断往上移动,直到最后一个节点不存在左右子节点则结束。
例子如图所示,
1、定义一个容器并初始化将root压入容器底部,将指针指向容器最底部;
2、读取指针指向的root节点发现root存在左子节点a和右子节点b,则将a和b依次压入容器,然后指针上移一位指向a节点;
3、读取指针指向的a节点发现a节点存在左子节点c和右子节点d,则将c和d压入容器,然后指针上移一位指向b节点;
4、类似执行步骤2或者3
5、如果有子节点则先将子节点压入容器然后再上移指针,如果没有子节点则直接上移指针
6、读取停止条件,当指针指向容器的最后一位的后一位时,可以断定已经将所有的节点都添加到容器中
代码
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def PrintFromTopToBottom(root):
if not root:
return []
# 创建一个列表和指针,初始化时将根节点添加到容器中,指针指向容器底部
stack = []
stack.append(root)
i = 0
while i != len(stack): # 结束条件,指针指向容器最后一位的后一位
p = stack[i]
if p.left: # 如果存在左子节点,则压入容器
stack.append(p.left)
if p.right: # 如果存在右子节点,则压入容器
stack.append(p.right)
i += 1 # 将指针向上移动
# 读取节点值并返回
stack = [node.val for node in stack]
return stack
测试:
root = TreeNode(8)
a = TreeNode(6)
b = TreeNode(10)
c = TreeNode(5)
d = TreeNode(7)
e = TreeNode(9)
f = TreeNode(11)
g = TreeNode(12)
h = TreeNode(13)
root.left = a
root.right = b
a.left = c
a.right = d
b.left = e
b.right = f
d.left = g
d.right = h
print(PrintFromTopToBottom(root))
上述测试的树结构如下图所示,对应得到输出为 [8, 6, 10, 5, 7, 9, 11, 12, 13]