返回

用两种方法全面剖析二叉树的前中后序遍历,为算法打开新世界的大门

前端

用递归遍历二叉树——一览无余,逐个击破

递归是计算机科学中一种重要的思想,用于解决各种问题。二叉树的遍历也可用递归实现,以先序遍历为例:

  1. 访问根节点。
  2. 递归地访问左子树。
  3. 递归地访问右子树。

让我们以一个具体的二叉树为例,理解递归遍历的过程:

       1
      / \
     2   3
    / \
   4   5

先序遍历 :1, 2, 4, 5, 3

中序遍历 :4, 2, 5, 1, 3

后序遍历 :4, 5, 2, 3, 1

从上述示例可以看出,递归遍历二叉树的过程非常直观,每个节点都会被访问到,并且访问顺序符合先序、中序或后序遍历的定义。

用非递归遍历二叉树——巧用栈,后发先至

除了递归,我们还可以使用非递归的方式遍历二叉树。非递归遍历不需要借助函数的递归调用,而是利用栈的数据结构来实现。

先序遍历

  1. 将根节点压入栈中。
  2. 弹出栈顶元素并访问之。
  3. 若栈顶元素的右子树不为空,则将其压入栈中。
  4. 若栈顶元素的左子树不为空,则将其压入栈中。
  5. 重复步骤2-4,直到栈为空。

中序遍历

  1. 将根节点压入栈中。
  2. 若栈顶元素的左子树不为空,则将其压入栈中。
  3. 弹出栈顶元素并访问之。
  4. 若栈顶元素的右子树不为空,则将其压入栈中。
  5. 重复步骤2-4,直到栈为空。

后序遍历

  1. 将根节点压入栈中。
  2. 若栈顶元素的左子树不为空,则将其压入栈中。
  3. 若栈顶元素的右子树不为空,则将其压入栈中。
  4. 弹出栈顶元素并访问之。
  5. 重复步骤2-4,直到栈为空。

同样以具体的二叉树为例,理解非递归遍历的过程:

       1
      / \
     2   3
    / \
   4   5

先序遍历 :1, 2, 4, 5, 3

中序遍历 :4, 2, 5, 1, 3

后序遍历 :4, 5, 2, 3, 1

从上述示例可以看出,非递归遍历二叉树的过程也十分清晰,每个节点都会被访问到,并且访问顺序符合先序、中序或后序遍历的定义。

用示例进一步加深理解

为了帮助您更好地理解二叉树的遍历,我们提供两个示例供您参考:

示例1 :给定二叉树:

       1
      / \
     2   3
    / \
   4   5

递归遍历

先序遍历 :1, 2, 4, 5, 3

中序遍历 :4, 2, 5, 1, 3

后序遍历 :4, 5, 2, 3, 1

非递归遍历

先序遍历 :1, 2, 4, 5, 3

中序遍历 :4, 2, 5, 1, 3

后序遍历 :4, 5, 2, 3, 1

示例2 :给定二叉树:

        1
       / \
      2   3
     / \   / \
    4   5 6   7

递归遍历

先序遍历 :1, 2, 4, 5, 3, 6, 7

中序遍历 :4, 2, 5, 1, 6, 3, 7

后序遍历 :4, 5, 2, 6, 7, 3, 1

非递归遍历

先序遍历 :1, 2, 4, 5, 3, 6, 7

中序遍历 :4, 2, 5, 1, 6, 3, 7

后序遍历 :4, 5, 2, 6, 7, 3, 1

结束语

通过本文,我们已经掌握了两种遍历二叉树的方法——递归和非递归。希望您能通过本文,对二叉树的遍历有了更深入的了解,并且能够灵活运用这些遍历方法来解决算法问题。