Loading

剑指 Offer 07. 重建二叉树

以前序遍历为基准,找到root
把中序遍历当工具,找到root的位置,以此找出原树中左子树的数目,右子树的数目
然后再使用递归左右子树

class Solution {
    int [] preorder;
    HashMap<Integer, Integer> dic = new HashMap<>();    
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        this.preorder = preorder;
        for(int i = 0; i < inorder.length; i++){
            dic.put(inorder[i], i);
        }
        return recur(0, 0, inorder.length - 1);
    }
	
    TreeNode recur(int root, int left, int right){
        if(left > right) return null;
        TreeNode node = new TreeNode(preorder[root]);
        int i = dic.get(preorder[root]); //找到根节点在中序遍历的位置
        node.left = recur(root + 1, left, i - 1);
        node.right = recur(root + i - left + 1, i + 1,right);
        return node;
    }
}
posted @ 2021-12-27 22:47  Zhbeii  阅读(23)  评论(0编辑  收藏  举报