二叉树的前序后序中序遍历之间的相互转换

已知这样的条件。
二叉树的前序后序中序遍历之间的相互转换

根据前序,我们知道root为A,在中序中找出A,那么A的左边都是左子树的节点了,即G,B,D,E,右边为右子树节点,即C,F,H。

再根据前序中左右的遍历规则,得到B为左子树的根节点,因为中序中,B的左边为G,那么G为B的左子节点。

对于B的右子树,也就是D,E的位置确定,对于中序,ED的 顺序可以是左中或者中右,而对于前序,DE的顺序为中左或者中右,那么结合来看,只能是D为B的右节点,E为D的左节点,这样符合规则。

对于右子树,同理很好分析出如图的结果。
这样,我们就根据前序和中序,重构出了二叉树。

同理,我们可以通过后序与中序,得到二叉树的结构,大体思路相同。
只不过,在后序中,根据左右中的遍历规则,树的root一定是最后一位

然后通过root在中序中的位置,找出左子树和右子树的元素,根据各自的遍历规则进行重构即可。
如图描述。

二叉树的前序后序中序遍历之间的相互转换

Codes here.
The metod is simliar to the describe of the change process.

  1. 已知前序和中序,重构二叉树

二叉树的前序后序中序遍历之间的相互转换

  1. 已知中序和后序,重构二叉树

二叉树的前序后序中序遍历之间的相互转换

大概解释一下。
首先创建一个哈希表,把inorder的值和序号存入,然后通过前序或者后序得到root,通过root的值从HashMap中找到对应的index,从而划分左子树和右子树,然后递归调用BuildTree的方法,最终当满足递归出口时跳出,这其中还是很有递归的味道的,值得细细品味,只可意会不可言传,因为我也言传不清哈哈哈,可以自己debug一下,每一步的递归返回就能一目了然了。
代码参考了LeetCode的官方题解。