剑指 Offer 07. 重建二叉树(day02)

题目

在这里插入图片描述

题解

官方题解:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/solution/mian-shi-ti-07-zhong-jian-er-cha-shu-by-leetcode-s/

根据前序遍历第一点就是根节点,我们可以根据前序遍历得到根节点然后去中序中找根节点的位置,找到根节点位置就可以根据中序遍历的结果得出左右子树的节点数,然后再根据得出的左右子树的节点数去前序遍历找出左右子树的范围。然后再根据相同的规律在左右子树的范围中利用这个规律去构建,这就是子问题了。可以用递归解决!!!

class Solution1 {

    private HashMap<Integer,Integer> indexMap;

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int n = preorder.length;
        // 构建哈希映射,便于快速找到根节点,值作键,索引做值
        indexMap = new HashMap<>();
        for (int i = 0; i < n; i++) {
            indexMap.put(inorder[i],i);
        }

        return myBuildTree(preorder,inorder,0,n-1,0,n-1);

    }

    public TreeNode myBuildTree(int[] preorder, int[] inorder, int pre_left, int pre_right, int ino_left, int ino_right){
        if (pre_left > pre_right){
            return null;
        }
        // 先序遍历第一个节点就是根节点
        int pre_root = preorder[pre_left];
        // 构建根节点
        TreeNode root = new TreeNode(pre_root);
        // 找出中序遍历的根节点位置
        int ino_root = indexMap.get(pre_root);

        // 得到左子树的个数
        int left_num = ino_root - ino_left;

        // 构建左子树
        root.left = myBuildTree(preorder,inorder,pre_left+1,pre_left+left_num,ino_left,ino_root-1);

        // 构建右子树
        root.right = myBuildTree(preorder,inorder,pre_left+left_num+1,pre_right,ino_root+1,ino_right);

        return root;

    }



}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值