树的前序中序后序遍历


1.前序遍历

前序遍历是指输出当前节点,再输出左子树,最后输出右子树。

对于上图的前序遍历顺序为:

先输出1,1的左子树2存在 -->  输出2,2的左子树4存在 --> 输出4,4的左子树不存在,右子树6存在 --> 输出6,6的左子树不存在,右子树7存在 --> 输出7,7的左子树不存在,右子树不存在。

此时我们观察到4的左右子树都已经遍历完(即2的左子树遍历完),开始访问2的右子树,2的右子树为空。

访问1的右子树,接下来的顺序依次是3 --> 5。遍历完成结束

所以前序遍历结果为:1 --> 2 --> 4 --> 6 -- >7 -->3 --> 5.


2.中序遍历

中序遍历是指先输出当前节点左子树,再输出当前节点,最后输出当前节点右子树。

对于上图的中序遍历顺序为:

1有左子树,访问2

2有左子树,访问4

4左子树为空,输出4,访问右子树6

6左子树为空,输出6,访问右子树7

7左子树为空,输出7,右子树为空

4作为2的左子树遍历完,输出2,访问2的右子树,2的右子树为空

2作为1的左子树遍历完成,输出1,访问1的右子树3

3有左子树,访问5

5左子树为空,输出5,右子树为空

5作为3的左子树遍历完成,输出5,右子树为空。

整棵树遍历结束。

中序遍历结果为:

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


3.后序遍历

后序遍历是指先输出当前节点左子树,再输出右子树,最后输出当前节点。

对于上图的后序遍历结果为:

1有左子树访问2

2有左子树访问4

4左子树为空,访问右子树6

6左子树为空,访问右子树7

7的左右子树都为空,输出7

6的左右子树遍历完,输出6

4的左右子树遍历完,输出4

2的左子树遍历完,右子树为空,输出2

1的左子树遍历完,访问右子树3

3有左子树访问5

5的左右子树为空输出5

3的左子树遍历完,右子树为空,输出3

1的左右子树遍历完,输出1

后序遍历顺序为:7 --> 6 --> 4 --> 2 --> 5 --> 3 --> 1


4.根据前中序结果推导出树的结构

代码实现

利用上述结果

前序遍历:1 --> 2 --> 4 --> 6 -- >7 -->3 --> 5

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

1)根据前序遍历先输出当前节点、再左子树、最后右子树顺序,我们可以知道每一个节点一定是某一棵树的根节点。例如1为整棵树的根节点。

2)根据中序遍历先输出左子树、再当前节点、再最后右子树的顺序,我们知道根节点一定是在中心位置的,根节点左边的节点一定是他的左子树,右边的节点一定是他的右子树。根据前序结果我们知道根节点为1,所以根据中序遍历结果我们可以知道根节点1的左子树节点有4、6、7、2,右子树节点有5、3。

3)对于4672这颗子树,根据前序结果,我们知道根节点为2,所以根据中序遍历结果2的左子树有467,无右子树。

4)对于467这颗子树,根据前序遍历结果,我们知道根节点为4,所以根据中序遍历结果4的左子树为空,右子树为67。

5)对67这颗子树,根据前序遍历结果,我们知道根节点为6,所以根据中序遍历结果4的左子树为空,右子树为7。

6)自此,根节点1的整个左子树遍历完成。结果如图所示:

 

7)对于根节点1的右子树53,根据前序遍历我们很容易推出3为下一棵子树的根节点,根据中序遍历推出5为3的左子树。

8)自此,整棵树根据前序中序结果推导完毕。


5.根据中后序结果推导出树的结构

代码实现

利用上述结果

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

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

1)根据后序遍历先输出左子树、再右子树、最后当前节点的顺序,我们知道后序遍历的根节点为最后一个节点1。

2)根据前面对中序遍历的分析,我们知道4672是根节点1的左子树,53是根节点1的右子树。

3)分析1左子树4672,根据后序遍历顺序,2为左子树的根节点;根据中序遍历顺序,确定467为2节点的左子树,2节点没有右子树。

4)分析2的左子树467,根据后续遍历顺序,4为根节点,根据中序遍历结果,67为4节点的右子树。

5)分析4的右子树67,根据后序遍历顺序,6为根节点,根据中序遍历结果,7为6节点的右子树。

6)根节点1的左子树全部推导完毕,右子树如法炮制,不再赘述。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值