题目:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
分析:
不管是广度优先遍历一副有向图还是一棵树,都要用到队列。首先把起始节点(对树而言是根节点)放入队列。接下来每次从队列的头部取出一个节点,遍历这个节点之后把它能够到达的节点(对树而言是子节点)都依次放入队列。重复这个遍历过程,知道队列中所有节点都被遍历为止。
为了把二叉树的每一行单独打印到一行,我们需要两个变量:
1、表示在当前层中还没有打印的节点数
2、表示下一层节点的数目
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def PrintAsLevel(root):
if not root:
return []
# 定义队列,这里用列表表示,出队的时候使用list().pop(0), 进队的时候使用list().append()
# 添加根节点进队以初始化队列
Queue = []
Queue.append(root)
layerVal = [] # 每一层要打印的节点值
Vals = [] # 最终输出
# 定义两个变量toBePrinted和nextLevel
# toBePrinted,表示当前层中还没有打印的节点数
# nextLevel,表示下一层的节点数
toBePrinted = 1
nextLevel = 0
while len(Queue):
node = Queue.pop(0)
toBePrinted -= 1
layerVal.append(node.val)
# 如果有子节点,则入队
if node.left:
Queue.append(node.left)
if node.right:
Queue.append(node.right)
# 如果当前层已经打印完,则进入下一层
if toBePrinted == 0:
toBePrinted, nextLevel = nextLevel, 0
Vals.append(layerVal)
layerVal = []
return Vals
测试与结果:
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(PrintAsLevel(root)) # [[8], [6, 10], [5, 7, 9, 11], [12, 13]]