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的左子树全部推导完毕,右子树如法炮制,不再赘述。