2020-09-25

106.从中序 从中序与后序遍历序列构造二叉树算法解答

问题链接

leetcode官网原题

开头暴击,不多bb

从中序我们可以知道根节点的左边是leftChild,右边是rightChild,以此为区间扩展自己的小弟,构造节点进行返回。
后序遍历可以告诉我们什么呢?首先,后序遍历原数组的最后一个节点肯定是根节点,比如[1,4,7,9],9肯定是根节点,如果9已经被构造了,数组变成了[1,4,7],这时候怎么解决?根据后序遍历的原顺序是  '左、右、中',变成数组的时候必定是逆序的,中节点已经用了,只剩下右节点和左节点,这时候先构造右节点,再构造左节点就完成了逆序。

再来一次暴击,直接上代码

class Solution {
    //把中序遍历的节点放进HashMap
    Map<Integer, Integer> inOrderIndexMap = new HashMap<>();
    int postIndex;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        //用hashmap来存储,更高效检索
        for (int i = 0; i < inorder.length; i++){
            inOrderIndexMap.put(inorder[i], i);
        }
        postIndex = postorder.length - 1;
        return constructTree(inorder, postorder, 0, inorder.length - 1);
    }
    public TreeNode constructTree(int[] inorder, int[] postorder, int preIn, int endIn){
        if (preIn > endIn){
            return null;
        }
        //可知后续遍历的最后一个节点为根节点
        int rootNum = postorder[postIndex--];
        //根节点在inorder中的顺序
        int rootIndex = inOrderIndexMap.get(rootNum);
        TreeNode root = new TreeNode(rootNum);
        //构造左右节点,这里先右后左一定要理解清楚,因为我们是跟后序比遍历反着来进行反向构造
        root.right = constructTree(inorder, postorder, rootIndex + 1, endIn);
        root.left = constructTree(inorder, postorder, preIn, rootIndex - 1);
        return root;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值