105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode) (leetcode-cn.com)

public class BuildTree {

    static HashMapmap =new HashMap<>();//标记中序遍历

    static int[]preorder;//保留的先序遍历

    public TreeNodebuildTree(int[] preorder, int[] inorder) {

            if(preorder.length==0||inorder.length==0)

                    return null;

            this.preorder = preorder;

            for (int i =0; i < inorder.length; i++) {

                map.put(inorder[i], i);

            }

            return recursive(0,0,inorder.length-1);

    }

    /**

    * @param pre_root_idx  先序遍历的索引(当前根节点)

    * @param in_left_idx  中序遍历的索引(当前二叉树在中序遍历中的左边界)

    * @param in_right_idx 中序遍历的索引(当前二叉树在中序遍历中的右边界)

    */

    public static TreeNoderecursive(int pre_root_idx, int in_left_idx, int in_right_idx) {

        if(in_left_idx>in_right_idx)

            return null;

        //获取当前根节点

        TreeNode root =new TreeNode(preorder[pre_root_idx]);

        // 在中序中获当前根的索引

        int idx =map.get(preorder[pre_root_idx]);

        //当前左子树的根节点就是前序遍历第一个,就是pre_root_idx+1,左边边界就是in_left_idx,右边边界是当前根的索引-1

        root.left =recursive(pre_root_idx+1,in_left_idx,idx-1);

        //当前右子树的根,就是右子树(前序遍历)的第一个,就是当前根节点+当前左子树的数量

        // pre_root_idx 当前的根  左子树的长度 = 左子树的左边-右边 (idx-1 - in_left_idx +1) 。最后+1就是右子树的根了

        root.right =recursive(pre_root_idx + (idx-1 - in_left_idx +1)  +1, idx +1, in_right_idx);

        return root;

    }

}

你可能感兴趣的:(105. 从前序与中序遍历序列构造二叉树)