3分钟理解二叉树的先序、中序、后序、递归序

332 阅读4分钟

前言

本文介绍二叉树的几种遍历方式:先序、中序、后序、递归序。

二叉树

二叉树(Binary Tree)是树形结构的一个非常重要的类型,他的每个节点最多有个两个分支,两个分支也被称为左子树、右子树。

二叉树拥有广泛的应用场景,是红黑树、二叉堆、多叉树、AVL树、有序表等大量数据结构的基础,所以说理解二叉树是非常有必要的。

如下图就是一个普通的二叉树。

用代码来定义一个二叉树:

public class Node {
   public int value;
   public Node left;
   public Node right;

   public Node(int v) {
      value = v;
   }
}

下面来介绍下二叉树的几种遍历方式:先序遍历、中序遍历、后序遍历。

先序遍历

先序遍历的顺序是:访问根节点(头)->遍历左子树(左)->遍历右子树(右),简称:头->左->右。

对于一棵二叉树来说,针对二叉树的每一个子树的顺都是:头->左->右。

例如上图中二叉树先序遍历的顺序为:1->2->4->5->3->6->7

对于根节点1来说,先访问它自己,然后遍历1的左子树2、4、5,再遍历1的右子树3、6、7

对于子节点2来说,先访问它自己,然后遍历2的左子树4,再遍历2的右子树5

所以说是对任意节点来说都是头->左->右。

代码实现:

代码实现的思路是,拿到根节点后,先打印自己,然后递归遍历根节点的左节点,最后递归遍历根节点的右节点。

public void pre(Node head) {
  if (head == null) {
    return;
  }
  System.out.println(head.value);
  pre(head.left);
  pre(head.right);
}

中序遍历

中序遍历的顺序是:遍历左子树(左)->访问根节点(头)->遍历右子树(右),简称:左->头->右。

对于一棵二叉树来说,针对二叉树的每一个子树的顺都是:左->头->右。

例如上图中二叉树中序遍历的顺序为:4->2->5->1->6->3->7

对于根节点1来说,先遍历1的左子树4、2、5,然后访问它自己1,再遍历1的右子树6、3、7

对于子节点2来说,先遍历2的左子树4,然后访问2自己,再遍历2的右子树5

所以说是对任意节点来说都是左->头->右。

代码实现:

代码实现的思路是,拿到根节点后,先递归遍历根节点的左节点,然后打印根节点,最后递归遍历根节点的右节点。

public void in(Node head) {
   if (head == null) {
      return;
   }
   in(head.left);
   System.out.println(head.value);
   in(head.right);
}

后序遍历

后序遍历的顺序是:遍历左子树(左)->遍历右树(右)->访问根节点(头),简称:左->右->头。

对于一棵二叉树来说,针对二叉树的每一个子树的顺都是:左->右->头。

例如上图中二叉树后序遍历的顺序为:4->5->2->6->7->3->1

对于根节点1来说,先遍历1的左子树4、5、2,再遍历1的右子树6、7、3,然后访问它自己1

对于子节点2来说,先遍历2的左子树4,再遍历2的右子树5,然后访问2自己。

所以说是对任意节点来说都是左->右->头。

代码实现:

代码实现的思路是,拿到根节点后,先递归遍历根节点的左节点,然后递归遍历根节点的右节点,最后打印根节点。

public void pos(Node head) {
   if (head == null) {
      return;
   }
   pos(head.left);
   pos(head.right);
   System.out.println(head.value);
}

递归序

从上面的分析以及代码来看,先序、中序、后序,只是打印这个操作放的位置不同,其他部分都是一样的,如果把打印操作去掉的话,那么这三个代码执行的结果是完全一样的,这就涉及到一个概念——递归序,也就是递归的顺序。

现在,我们把打印操作去掉,得到的函数为:

public void func(Node head) {
   if (head == null) {
      return;
   }
   func(head.left);
   func(head.right);
}

我们针对上图,上这段代码来看下节点的访问顺序:

1->2->4->null->4->null->4->2->5->null->5->null->5->2->1->3->6->null->6->null->6->3->7->null->7->null->7->3->1。

下面,我们再来看下,什么叫先序遍历,先序遍历是第1次遇到这个数就输出它,得到的结果就是先序遍历结果,把上述访问链的第1次遇到的数输出如下:1->2->4->5->3->6->7,看一下是不是先序遍历的结果?答案是肯定的。

再看下中序遍历,中序遍历是第2次遇到这个数就输出,得到的结果就是中序遍历的结果。把上述访问链的第2次遇到的数输出如下:4->2->5->1->6->3->7

同样的,后续遍历为在递归链中第3次遇到这个数就输出,把上述访问链的第3次遇到的数输出如下:4->5->2->6->7->3->1

总结

本文介绍二叉树的几种遍历方式:先序、中序、后序、递归序,并用递归序证明了先、中、后序遍历的原理。

如果本文对你有帮助,就帮忙点个赞吧^_^