前言
如何仅通过中序和后序遍历的结果,来唯一恢复一个二叉树?
(思路来源:《Hello 算法》《算法村》)
题目
中序遍历:[5, 3, 15, 11, 16, 7, 1, 4, 13, 9]
后序遍历:[5, 15, 16, 11, 7, 3, 13, 9, 4, 1]
思路如下:
解题过程
由思路可知,对一颗二叉树进行遍历,
如果是前序遍历,根节点在第一个;
如果是后序遍历,根节点在最后一个。
因此,对于后序遍历结果,我们可知1是根节点。
对中序和后序结果进行划分如下:
中序:【5, 3, 15, 11, 16, 7】, 1, 【4, 13, 9】
后序:【5, 15, 16, 11, 7, 3】, 【13, 9, 4】, 1
其中,中序的划分结果显而易见,1左边是其左子树,1右边是其右子树。
重点:对后序划分有赖于中序的结果,我们需要找到与中序的两个子树内容分别相同的部分,按照这两个部分进行划分。后序中这样的划分其实也是对上述两个部分的后序遍历结果,中序中的划分是对这两个部分的中序遍历结果。
随后,我们尝试恢复左子树:[5, 3, 15, 11, 16, 7]。
中序:[5, 3, 15, 11, 16, 7]
后序:[5, 15, 16, 11, 7, 3]
思路同上,第二次划分结果:
中序:【5】, 3, 1【5, 11, 16, 7】
后序:【5】, 【15, 16, 11, 7】, 3
一步步走下来即可。最后的结果: