剑指 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;
}
}