其他分享
首页 > 其他分享> > LeetCode105从前序与中序遍历序列构造二叉树(递归)

LeetCode105从前序与中序遍历序列构造二叉树(递归)

作者:互联网

在这里插入图片描述
这题上来思路和官方题解的递归一模一样,但是自己就是写不出来
先说下思路 先序第一个结点一定是头结点,在中序中找到头结点的位置,此时在中序序列中头结点的左侧为左子树的全部结点,右侧为右子树的全部结点,而先序序列中野为[{根节点},{左子树}],{右子树}现在就转换成了子问题,每一个树都如此去构建,先构建左子树再构建右子树。
用hashmap存中序结点的下标,节省时间

    private Map<Integer, Integer> map = new HashMap<>();
    public TreeNode build(int preorder[],int pre_l,int pre_r,int in_l,int in_r){
        if (pre_l>pre_r) return null;
        int pre_root = pre_l;//在先序中的下标
        int in_root = map.get(preorder[pre_root]);//在中序中的下标
        int l_len = in_root - in_l;//左子树长度
        TreeNode root = new TreeNode(preorder[pre_l]);
        //构造左子树
        root.left = build(preorder,pre_l+1,pre_l+l_len,in_l,in_root-1);
        //构造右子树
        root.right = build(preorder,pre_l+l_len+1,pre_r,in_root+1,in_r);
        return root;
    }
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int len = preorder.length;
        for (int i = 0; i < len; i++) {
            map.put(inorder[i],i);
        }
        return build(preorder,0,len-1,0,len-1);
    }

标签:pre,preorder,结点,int,中序,len,LeetCode105,二叉树,root
来源: https://blog.csdn.net/qq_43434328/article/details/113406173