返回

与深度优先搜索的不同之处在于广度优先搜索更适合

前端

输入

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将遍历整个二叉树,并将每个节点的值添加到相应的层级中。最后,我们将所有层级列表反转,就可以得到从底层到顶层的层次遍历结果。