【面试题32-2 分行从上到下打印二叉树】
难度: 简单
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。
思路:由于要分层打印,每次入队后求一下队列的长度,仅将长度内(同一层)的节点放在一个列表里,就能实现分层打印啦。
代码逻辑:
- 初始化一个包含根节点的队列 queue,空的结果列表 res
- 获取当前队列长度(当前层节点个数),循环执行队首元素出队,将队首元素值添加到临时列表 layer 尾部,向 queue 中添加队首元素的左右子节点(若不为空)
- 将 layer 添加到结果列表 res 的尾部
[]
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, queue = [], [root]
while queue:
n = len(queue)
layer = []
for _ in range(n): # print layer
t = queue.pop(0) # 时间复杂度:O(n)
layer.append(t.val)
if t.left: queue.append(t.left)
if t.right: queue.append(t.right)
res.append(layer)
return res
同样可以用双端队列进行优化,使出队列的时间复杂度为 O(1)。
时间复杂度:O(n),遍历节点个数为 n 的二叉树
空间复杂度:O(n),最差情况下(平衡二叉树),同时有 n/2 个节点同时在 queue 中
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
if not root: return []
res, queue = [], collections.deque() # 双端队列
queue.append(root)
while queue:
tmp = []
for _ in range(len(queue)):
node = queue.popleft() # 时间复杂度:O(1)
tmp.append(node.val)
if node.left: queue.append(node.left)
if node.right: queue.append(node.right)
res.append(tmp)
return res