LeetCode每日一题105. 从前序与中序遍历序列构造二叉树

121 阅读1分钟

class Solution {
    private HashMap<Integer, Integer> indexMap;
    private int[] preorder;
    private int[] inorder;

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder = preorder;
        this.inorder = inorder;
        if (preorder.length == 0) return null;
        indexMap = new HashMap<>();
        for (int i = 0; i < inorder.length; i++) {
            indexMap.put(inorder[i], i);
        }
        return dfs(0, preorder.length - 1, 0, inorder.length - 1);
    }

    private TreeNode dfs(int preLeft, int preRight, int inLeft, int inRight) {
        if (preLeft > preRight || inLeft > inRight) return null;
        int rootValue = preorder[preLeft];
        Integer rootIndex = indexMap.get(rootValue);
        TreeNode root = new TreeNode(rootValue);
        int leftLen = rootIndex - inLeft;
        root.left = dfs(preLeft + 1, preLeft + leftLen, inLeft, rootIndex - 1);
        root.right = dfs(preLeft + leftLen + 1, preRight, rootIndex + 1, inRight);
        return root;
    }
}