
一:前序遍历
对于当前节点,先输出该节点,然后输出它的左孩子,最后输出它的右孩子。
即根结点 ---> 左子树 ---> 右子树。以上图为例,递归的过程如下:
-
首先输出根节点1。
-
输出左儿子2。
-
因为2没有左儿子,所以输出下一个,即输出右儿子5。
-
因为5没有左儿子,所以输出下一个,即输出右儿子8。
-
至此根的左儿子都输出完毕,开始输出它即1的右儿子,右儿子第一个为3。
-
输出3的左儿子6。
-
输出3的右儿子7。
-
至此全部输出完毕,结束。
所以输出的结果前序遍历结果是:1 2 5 8 3 6 7
二:中序遍历
首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回。
即左子树---> 根结点 ---> 右子树。以上图为例,对左右子树分别进行左儿子-->自己-->右儿子输出,递归的过程如下:
-
首先输出左儿子,因为2没有左儿子,所以输出自己2。
-
准备输出2的右儿子5,若5有左儿子,则输出该元素,现在因为5没有左儿子,所以输出5。
-
输出5的右儿子8。
-
至此左子树输出完毕,输出根节点1。
-
开始输出右子树,因为3有左子树,所以首先输出6,然后输出3。
-
输出3的右子树7。
-
至此全部输出结束。
所以输出的结果中序遍历结果是:2 5 8 1 6 3 7
三:后序遍历
对于当前结点,先输出它的左孩子,然后输出它的右孩子,最后输出该结点。即左子树 ---> 右子树 ---> 根结点 递归的过程如下:
-
首先输出左子树,因为2有右孩子5,而5又有右儿子,所以先输出8。
-
输出8之后,输出自己5。
-
然后输出节点2。
-
至此左子树遍历完毕,开始遍历右子树,因为3有左子树,所以输出6,输出右子树7,最后输出自己3。
-
最后输出根节点1。
-
至此全部输出完毕。
所以输出的结果后序遍历结果是:8 5 2 6 7 3 1
四:讲完了左右子树的概念之后,我们根据前序遍历中序遍历推导树的结构。
前序遍历:1 2 5 8 3 6 7
中序遍历:2 5 8 1 6 3 7
-
首先知道前序遍历的第一个节点是根节点1,可以通过该节点1在中序遍历中把子树分成左右子树,即左子树中有2 5 8,右子树中右6 3 7
-
根据前序遍历的特点,我们可以得到2是左子树的根节点。
-
那么5,8的具体的位置,我们无法从前序遍历中得到结果,那么我们是否可以从中序遍历中获取结果呢?根据中序遍历的特点(左儿子-->自己-->右儿子)我们可以得到5是2的右儿子。
-
再来看8,因为5是2的右儿子,所以8不可能是2的儿子,8只能是5的儿子,那么8是5的左儿子还是右儿子呢?假设8是5的左儿子,那么不满足中序遍历的2 5 8,而应该是2 8 5,所以8是5的右儿子。
-
至此左子树的排序完成。
-
再来看右边的6 3 7。
-
根据前序遍历,去掉2 5 8,可得3 6 7,那么3是右子树的根节点。
-
再根据中序遍历的特点,因为右子树是6 3 7,所以6是3的左儿子,7是3的右儿子。
-
至此右子树的分析也结束了。
至此我们得到了整棵数的结构。
五:我们根据中序遍历后序遍历推导树的结构。
中序遍历:2 5 8 1 6 3 7
后序遍历:8 5 2 6 7 3 1
-
根据后序遍历的特点,即根节点是后序遍历的最后一个节点1,可以通过1,在中序遍历中把树分成左子树和右子树,即1的左半部分为左子树2 5 8,右子树6 3 7。
-
根据后序遍历的特点是左子树-->右子树-->自己,所以8 5 2中2是左子树的根节点。
-
根据中序遍历,5 8在2的右边,所以只能是2的右子树的元素,又2只会有一个右儿子,所以5是2的右儿子,最后剩下8是5的什么儿子呢?根据中序遍历的特点,若8是5左儿子,那么中序遍历应该是2 8 5,所以8是5的右儿子。
-
至此1的左子树排序完成。
-
再看6 3 7,根据后序遍历,可得3是右子树的根节点,再看中序遍历,6 3 7,所以6 7分别是3的左儿子和右儿子。
-
至此右子树排序完成。
至此我们得到了整棵数的结构。
本文详细讲解了二叉树的前序、中序、后序遍历,通过实例展示了遍历过程,并介绍了如何根据遍历结果推导树的结构。前序遍历结果为1 2 5 8 3 6 7,中序遍历结果为2 5 8 1 6 3 7,后序遍历结果为8 5 2 6 7 3 1。
5745

被折叠的 条评论
为什么被折叠?



