返回
与深度优先搜索的不同之处在于广度优先搜索更适合
前端
2023-12-14 07:58:54
输入
def levelOrderBottom(root: TreeNode) -> List[List[int]]:
"""
Given a binary tree, return the bottom-up level order traversal of its nodes' values. (i.e., from left to right, level by level from leaf to root)
Example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]
Constraints:
The number of nodes in the tree is in the range [0, 2000].
-1000 <= Node.val <= 1000
"""
levels = []
if not root:
return levels
def helper(node, level):
# start the current level
if len(levels) == level:
levels.append([])
# append the current node value
levels[level].append(node.val)
# process child nodes
if node.left:
helper(node.left, level + 1)
if node.right:
helper(node.right, level + 1)
helper(root, 0)
return levels[::-1]
广度优先搜索(BFS)和深度优先搜索(DFS)都是遍历二叉树的常用方法,但它们在遍历顺序上存在差异。BFS按层级遍历二叉树,从根节点开始,依次访问每一层的所有节点,然后再访问下一层的节点,直到遍历完所有节点。而DFS则按深度遍历二叉树,从根节点开始,一直访问到最深的子节点,然后再回溯到父节点,依次访问其它的子节点,直到遍历完所有节点。
在二叉树的层次遍历问题中,我们需要从底层开始遍历,因此广度优先搜索更适合。因为广度优先搜索的遍历顺序是按层级从底层到顶层,而深度优先搜索的遍历顺序是按深度从顶层到底层,所以广度优先搜索可以更方便地实现从底层到顶层的遍历。
在上面的Python代码中,我们使用了一个递归函数helper
来实现广度优先搜索。函数helper
首先检查当前层级是否已经存在,如果不存在则创建一个新的列表来存储该层级的节点值。然后,将当前节点的值添加到该层级的列表中。最后,分别对左子节点和右子节点调用helper
函数,将左子节点和右子节点的子树加入到当前层级中。
经过递归调用,函数helper
将遍历整个二叉树,并将每个节点的值添加到相应的层级中。最后,我们将所有层级列表反转,就可以得到从底层到顶层的层次遍历结果。