问题来源:二叉树层次遍历
问题描述:给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例子:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
思路:广度遍历和深度遍历。
1. 广度遍历
与一般的广度遍历不同的是,每次遍历都将queue弹空,这样就能保证每次queue里存储的都是一个层次的元素。
# 广度遍历
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
# 如果树为空
if not root:
return []
# 如果树非空
queue = []
queue.append(root)
res = []
while queue:
res.append([])
cur_level = len(queue)
for i in range(cur_level):
temp = queue.pop(0)
res[-1].append(temp.val)
if temp.left:
queue.append(temp.left)
if temp.right:
queue.append(temp.right)
return res
2. 深度遍历
与一般深度遍历不同的是,递归过程中我们仅需记住当前节点与层次即可。
# 深度遍历
class Solution:
def levelOrder(self, root: TreeNode) -> List[List[int]]:
# 树为空
if root == []:
return []
# 树非空
res = []
def Helper(node, level):
if len(res) == level:
res.append([])
res[level].append(node.val)
if node.left:
Helper(node.left, level+1)
if node.right:
Helper(node.right, level+1)
return Helper(root, 0)