在之前的 二叉树 章节当中,我们介绍了二叉树的定义以及性质,所以本章我们就重点来看看二叉树遍历的相关内容
二叉树的遍历
二叉树的遍历(traversing binary tree
)是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次的遍历方式,这里需要注意上文提及的两个概念『某种次序依次访问』和『访问一次且仅被访问一次』
这是因为二叉树的遍历次序不同于线性结构,因为线性结构最多也就是分为顺序、循环、双向等简单的遍历方式,而树的结点之间不存在唯一的前驱和后继这样的关系,所以在访问一个结点后,下一个被访问的结点面临着不同的选择,所以二叉树的遍历方式就可以有很多,在这里我们简单的总结一下,主要分为以下四种遍历方式
- 前序遍历
- 中序遍历
- 后序遍历
- 层序遍历
有个比较简单的记忆方式就是
- 先序遍历,根 ==> 左 ==> 右
- 中序遍历,左 ==> 根 ==> 右
- 中序遍历,左 ==> 右 ==> 根
可以发现,前中后的遍历顺序是看『根结点』放在何处来决定的,下面我们就借助下方这个二叉树的图(注意不是完全二叉树),一个一个来进行了解
前序遍历
基本逻辑是,如果二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树,顺序如下图所示
遍历的顺序为 A ==> B ==> D ==> H ==> I ==> E ==> J ==> C ==> F ==> K ==> G
中序遍历
若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树,顺序如下图所示
遍历的顺序为 H ==> D ==> I ==> B ==> E ==> J ==> A ==> F ==> K ==> C ==> G
后序遍历
若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后访问根结点,顺序如下图所示
遍历的顺序为 H ==> I ==> D ==> J ==> E ==> B ==> K ==> F ==> G ==> C ==> A
层序遍历
这个也是我们最好理解的方式,就是一层一层的遍历,若树为空,则空操作返回,否则从树的第一层,也就是根结点开始访问,从上而下逐层遍历,在同一层中,按从左到右的顺序对结点逐个访问,顺序如下图所示
遍历的顺序为 A ==> B ==> C ==> D ==> E ==> F ==> G ==> H ==> I ==> J ==> K
二叉树的建立和遍历
我们直接来看如何用代码进行实现
1 | // 首先创建一个类来表示二叉树,它的内部有一个 Node 类,用来创建节点 |
我们通过上面的方式实现了对二叉树的节点插入,和三种遍历方法,同时我们很明显可以看到,在二叉树当中,最左侧的节点的值是最小的,而最右侧的节点的值是最大的,而这些内容对于我们在后面将要介绍到的 二叉排序树 有很大帮助,因为我们可以借住二叉查找树很方便的拿到其中的最大值和最小值
另外可以发现,我们也并没有涉及到比如在二叉树当中查找给定的值,亦或者删除某个给定的值的操作,关于这些内容我们会在后面的 二叉排序树 当中重点来进行介绍