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

    技术2026-01-26  12

    已知这样的条件。

    根据前序,我们知道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.

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

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

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

    Processed: 0.031, SQL: 9