二叉树的遍历:
前序遍历(先序遍历)、中序遍历、后续遍历
二叉树的遍历是指不重复地访问二叉树中所有结点,主要指非空二叉树,对于空二叉树则结束返回,二叉树的遍历主要包括前序遍历、中序遍历、后序遍历
给定了二叉树的任何一种遍历序列,都无法唯一确定相应的二叉树。但是如果知道了二叉树的中序遍历序列和任意的另一种遍历序列,就可以唯一地确定二叉树。
一、前序遍历(先序遍历):(根->左->右)
前序遍历:首先访问根结点,然后遍历左子树,最后遍历右子树;
顺序:访问根节点->前序遍历左子树->前序遍历右子树。
举例1:
例1
如图所示:
对于当前节点,先输出该节点,然后输出他的左孩子,最后输出他的右孩子。以上图为例,递归的过程如下:
(1):输出 1,接着左孩子;
(2):输出 2,接着左孩子;
(3):输出 4,左孩子为空,再接着右孩子;
(4):输出 6,左孩子为空,再接着右孩子;
(5):输出 7,左右孩子都为空,此时 2 的左子树全部输出,2 的右子树为空,此时 1 的左子树全部输出,接着 1 的右子树;
(6):输出 3,接着左孩子;
(7):输出 5,左右孩子为空,此时 3 的左子树全部输出,3 的右子树为空,至此 1 的右子树全部输出,结束。
先序遍历(根左右):1246735
每次都是先遍历树的左子树,然后再遍历树的右子树,最后再遍历根节点,以此类推,直至遍历完整个树。
举例2:
例2
先序遍历(根左右):A B D H E I C F J K G
二、中序遍历:(左->根->右)
中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树;
顺序:中序遍历左子树->访问根节点->中序遍历右子树。
举例1:
例1
对于当前结点,先输出它的左孩子,然后输出该结点,最后输出它的右孩子。以上图为例:
(1):1–>2–>4,4 的左孩子为空,输出 4,接着右孩子;
(2):6 的左孩子为空,输出 6,接着右孩子;
(3):7 的左孩子为空,输出 7,右孩子也为空,此时 2 的左子树全部输出,输出 2,2 的右孩子为空,此时 1 的左子树全部输出,输出 1,接着 1 的右孩子;
(4):3–>5,5 左孩子为空,输出 5,右孩子也为空,此时 3 的左子树全部输出,而 3 的右孩子为空,至此 1 的右子树全部输出,结束。
举例2:
例2
中(根)序遍历(左根右) : D H B E I A J F K C G
三、后序遍历:(左->右->根)
后序遍历:首先遍历左子树,然后遍历右子树,最后访问根节点;
顺序:后序遍历左子树->后序遍历右子树->访问根节点。
举例1:
例1
对于当前结点,先输出它的左孩子,然后输出它的右孩子,最后输出该结点。依旧以上图为例:
(1):1->2->4->6->7,7 无左孩子,也无右孩子,输出 7,此时 6 无左孩子,而 6 的右子树也全部输出,输出 6,此时 4 无左子树,而 4 的右子树全部输出,输出 4,此时 2 的左子树全部输出,且 2 无右子树,输出 2,此时 1 的左子树全部输出,接着转向右子树;
(2):3->5,5 无左孩子,也无右孩子,输出 5,此时 3 的左子树全部输出,且 3 无右孩子,输出 3,此时 1 的右子树全部输出,输出 1,结束。
举例2:
例2
后(根)序遍历(左右根) : H D I E B J K F G C A
四、给定了二叉树的任何一种遍历序列,都无法唯一确定相应的二叉树。如果给定了二叉树的中序遍历序列和任意的另一种遍历序列,就可以唯一地确定二叉树。
(1)、根据前序遍历中序遍历推导树的结构
已知:
前序遍历: GDAFEMHZ
中序遍历: ADEFGHMZ
求后序遍历
首先,要先画出这棵二叉树,怎么画呢?根据上面说的我们一步一步来……
1.先看前序遍历,前序遍历第一个一定是根节点,那么我们可以知道,这棵树的根节点是G,接着,我们看中序遍历中,根节点一定是在中间访问的,那么既然知道了G是根节点,则在中序遍历中找到G的位置,G的左边一定就是这棵树的左子树,G的右边就是这棵树的右子树了。
2.我们根据第一步的分析,大致应该知道左子树节点有:ADEF,右子树的节点有:HMZ。同时,这个也分别是左子树和右子树的中序遍历的序列。
3.在前序遍历遍历完根节点后,接着执行前序遍历左子树,注意,是前序遍历,什么意思?就是把左子树当成一棵独立的树,执行前序遍历,同样先访问左子树的根,由此可以得到,左子树的根是D,第2步我们已经知道左子树是ADEF了,那么在这一步得到左子树的根是D,请看第4步。
4.从第2步得到的中序遍历的节点序列中,找到D,发现D左边只有一个A,说明D的左子树只有一个叶子节点,D的右边呢?我们可以得到D的右子树有EF,再看前序遍历的序列,发现F在前,也就是说,F是先前序遍历访问的,则得到E是F的左子树,只有一个叶子节点。
5.到这里,我们可以得到这棵树的根节点和左子树的结构了。如下图:
6.接着看右子树,在第2步的右子树中序遍历序列中,右子树是HMZ三个节点,那么先看前序遍历的序列,先出现的是M,那么M就是右子树的根节点,刚好,HZ在M的左右,分别是它的左子树和右子树,因此,右子树的结构就出来了:
7.到这里,我们可以得到整棵树的结构:
(2)、根据树的中序遍历后序遍历推导树的结构
已知:
中序遍历:ADEFGHMZ
后序遍历:AEFDHZMG
1…根据后序遍历的特点(左右中),根节点在结尾,确定G是根节点。根据中序遍历的特点(左中右),确定ADEF组成左子树,HMZ组成右子树。
2.分析左子树。ADEF这四个元素在后序遍历(左右中)中的顺序是AEFD,在中序遍历(左中右)中的顺序是ADEF。根据后序遍历(左右中)的特点确定D是左子树的节点,根据中序遍历(左中右)的特点发现A在D前面,所以A是左子树的左叶子,EF则是左子树的右分枝。
EF在后序(左右中)和中序(左中右)的相对位置是一样的,所以EF关系是左右或者左中,排除左右关系(缺乏节点),所以EF关系是左中。
到此得出左子树的形状
3.分析右子树。HMZ这三个元素在中序遍历(左中右)的顺序是HMZ,在后序遍历(左右中)的顺序是HZM。根据后序遍历(左右中)的特点,M在尾部,即M是右子树的节点。再根据中序遍历(左中右)的特点,确定H(M的前面)是右子树的左叶子,Z(M的后面)是右子树的右叶子。
所以右子树的形状
4、最后得出整棵树的形状
参考原文地址:
1、https://www.jianshu.com/p/1c50b23fcc30
2、https://blog.csdn.net/qq_34840129/article/details/80619761