无法播放?请 点击这里 跳转到Youtube
切换视频源:

题目链接: https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

GitHub答案源代码请点击这里

Left Right Bounds

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer, Integer> in_map = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
            in_map.put(inorder[i], i);
        }
        return dfs(preorder, in_map, 0, preorder.length - 1, 0, inorder.length - 1);
    }
    
    private TreeNode dfs(int[] pre, Map<Integer, Integer> in_map, int prel, int prer, int inl, int inr) {
        if (inl > inr) {
            return null;
        }
        
        TreeNode root = new TreeNode(pre[prel]);
        
        int root_position = in_map.get(root.val);
        int left_subtree_len = root_position - inl;
        
        root.left = dfs(pre, in_map, prel + 1, prel + left_subtree_len, inl, root_position - 1);
        root.right = dfs(pre, in_map, prel + left_subtree_len + 1, prer, root_position + 1, inr);
        return root;
    }
}

Left Bounds Length

class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        Map<Integer, Integer> in_map = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
            in_map.put(inorder[i], i);
        }
        return dfs(preorder, in_map, 0, 0, preorder.length);
    }
    
    private TreeNode dfs(int[] pre, Map<Integer, Integer> in_map, int prel, int inl, int len) {
        if (len == 0) {
            return null;
        }
        
        TreeNode root = new TreeNode(pre[prel]);
        
        int root_position = in_map.get(root.val);
        int left_subtree_len = root_position - inl;
        
        root.left = dfs(pre, in_map, prel + 1, inl, left_subtree_len);
        root.right = dfs(pre, in_map, prel + left_subtree_len + 1, root_position + 1, len - left_subtree_len - 1);
        return root;
    }
}