Gyh's Braindump

CN-07. Rebuild binary tree

tags
BinaryTree, Recursion
source
leetcode-cn

Edge Cases

Solution

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        if (preorder.length == 0) return null;
        Map<Integer, Integer> index = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
            index.put(inorder[i], i);
        }
        return buildTreeHelper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1, index);
    }

    private TreeNode buildTreeHelper(int[] preorder, int pl, int pr, int[] inorder, int il, int ir, Map<Integer, Integer> index) {
        if (pl == pr) { // or il == ir
            return new TreeNode(preorder[pl]);
        }
        if (pl > pr || il > ir) {
            return null;
        }
        // root node
        TreeNode root = new TreeNode(preorder[pl]);

        // find left tree part
        int leftSize = index.get(root.val) - il;

        // build child tree
        root.left = buildTreeHelper(preorder, pl + 1, pl + leftSize, inorder, il, il + leftSize - 1, index);
        root.right = buildTreeHelper(preorder, pl + leftSize + 1, pr, inorder, il + leftSize + 1, ir, index);

        return root;
    }
}

Complexity

  • time: O(N) + O(N)
  • space: O(N)