遍历二叉树可以算作是对树存储结构做的最多的操作,既是重点,也是难点。本节将从初学者的角度给大家分析一下 4 种遍历二叉树算法的由来。
图 1 二叉树示意图
图 1 是一棵二叉树,对于初学者而言,遍历这棵二叉树无非有以下两种方式。
图 2 层次遍历二叉树示意图
图 3 普通方式遍历二叉树
以上仅是从初学者的角度,对遍历二叉树的过程进行了分析。接下来我们从程序员的角度再对以上两种遍历方式进行剖析。
这里,我们要建立一个共识,即成功遍历二叉树的标志是能够成功访问到二叉树中所有的节点。
图 4 遍历节点 2 的过程示意图
因此,在编程实现时,我们可以设定真正访问各个节点的时机,换句话说,我们既可以在第一次经过各节点时就执行访问程序,也可以在第二次经过各节点时访问,甚至可以在最后一次经过各节点时访问。这也就引出了以下 3 种遍历二叉树的算法:
遍历二叉树的算法
![b99b091f1998a5a116130b87f5f77e4f.png](https://i-blog.csdnimg.cn/blog_migrate/8772ab913ed8601fd40c35b08d6d83bc.jpeg)
层次遍历
前面讲过,树是有层次的,拿图 1 来说,该二叉树的层次为 3。通过对树中各层的节点从左到右依次遍历,即可实现对正棵二叉树的遍历,此种方式称为层次遍历。比如,对图 1 中二叉树进行层次遍历,遍历过程如图 2 所示:![21f734a5a76d0f89c331b0ef9daa487b.png](https://i-blog.csdnimg.cn/blog_migrate/9c5f07a7c2403ca8fb274b9642dd1256.jpeg)
普通遍历
其实,还有一种更普通的遍历二叉树的思想,即按照 "从上到下,从左到右" 的顺序遍历整棵二叉树。还拿图 1 中的二叉树举例,其遍历过程如图 3 所示:![cd7b18f85e6a84a8fba50cfe4221d82b.png](https://i-blog.csdnimg.cn/blog_migrate/617e25952ddc74660882bb96ccf9a276.jpeg)
二叉树遍历算法再剖析
首先观察图 2 中的层次遍历,整个遍历过程只经过各个节点一次,因此在层次遍历过程,每经过一个节点,都必须立刻访问该节点,否则错失良机,后续无法再对其访问。若对图 1 中二叉树进行层次遍历,则访问树中节点的次序为: 1 2 3 4 5 6 7 而普通遍历方式则不同,通过观察图 3 可以看到,整个遍历二叉树的过程中,每个节点都被经过了 3 次(虽然叶子节点看似只经过了 2 次,但实际上可以看做是 3 次)。以图 3 中的节点 2 为例,如图 4 所示,它被经过了 3 次。![08442e36eb3fc3c8fd5cb45aa705c134.png](https://i-blog.csdnimg.cn/blog_migrate/07b7c87768044021f012ea3be8c98f10.jpeg)
- 先序遍历:每遇到一个节点,先访问,然后再遍历其左右子树(对应图 4 中的 ①);
- 中序遍历:第一次经过时不访问,等遍历完左子树之后再访问,然后遍历右子树(对应图 4 中的 ②);
- 后序遍历:第一次和第二次经过时都不访问,等遍历完该节点的左右子树之后,最后访问该节点(对应图 4 中的 ③);