📜  二叉树的 BFS 与 DFS

📅  最后修改于: 2022-05-13 01:57:17.079000             🧑  作者: Mango

二叉树的 BFS 与 DFS

二叉树的 BFS 和 DFS 是什么?
树通常以两种方式遍历:

  • 广度优先遍历(或水平顺序遍历)
  • 深度优先遍历
    • 中序遍历(左-右-右)
    • 前序遍历(Root-Left-Right)
    • 后序遍历(左右根)

Example Tree

BFS and DFSs of above Tree

Breadth First Traversal : 1 2 3 4 5

Depth First Traversals:
      Preorder Traversal : 1 2 4 5 3 
      Inorder Traversal  :  4 2 5 1 3 
      Postorder Traversal : 4 5 2 3 1

我们为什么关心?
使用上述四种遍历中的任何一种都可以解决许多树问题。此类问题的示例是大小、最大值、最小值、打印左视图等。

时间复杂度有什么不同吗?
所有四个遍历都需要 O(n) 时间,因为它们恰好访问每个节点一次。

额外空间有什么不同吗?
所需的额外空间有所不同。

  1. 级别顺序遍历所需的额外空间为 O(w),其中 w 是二叉树的最大宽度。在层序遍历中,队列一个一个地存储不同层级的节点。
  2. 深度优先遍历所需的额外空间为 O(h),其中 h 是二叉树的最大高度。在深度优先遍历中,堆栈(或函数调用堆栈)存储节点的所有祖先。

二叉树在深度(或高度)h 处的最大宽度可以是 2 h ,其中 h 从 0 开始。因此最大节点数可以在最后一级。当二叉树是一个完美的二叉树时,最坏的情况会发生,节点数量为 1、3、7、15 等。在最坏的情况下,2 h的值为Ceil(n/2)

平衡二叉树的高度为 O(Log n)。最坏情况发生在倾斜树上,最坏情况高度变为 O(n)。

因此,在最坏的情况下,两者所需的额外空间都是 O(n)。但最坏的情况发生在不同类型的树上。

从以上几点可以看出,当树更平衡时,级别顺序遍历所需的额外空间可能会更多,而当树不平衡时,深度优先遍历所需的额外空间可能会更多。

如何选择一个?

  1. 额外空间可能是一个因素(如上所述)
  2. 深度优先遍历通常是递归的,递归代码需要函数调用开销。
  3. 最重要的一点是,BFS 从根开始访问节点,而 DFS 从叶子开始访问节点。因此,如果我们的问题是搜索更接近根目录的东西,我们更喜欢 BFS。如果目标节点靠近叶子,我们更喜欢 DFS。

锻炼:
应该使用哪种遍历来打印二叉树的叶子,为什么?
应该使用哪种遍历来打印第 k 层的节点,其中 k 远小于总层数?