[剑指offer07.重建二叉树]
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
例如,给出
前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3 / \ 9 20 / \ 15 7
算法思想:递归思想
前序遍历:根左右
中序遍历:左根右
1.创建为根节点,根结点的值为子树范围内前序遍数组的首个下标位置的值,
2.用两个变量left,right记录中序遍历数组此根节点所在的子树范围,这样做能知道根结点所在的子树中,左子树的范围,以及右子树的范围,方便递归
public TreeNode buildTree(int[] preorder, int[] inorder) {
HashMap<Integer,Integer> map =new HashMap<Integer,Integer>();
for(int i=0;i<inorder.length;i++){
map.put(inorder[i],i);//利用hashmap记录根节点在中序遍历数组中的下标位置,为划分左右子树做准备
}
return dfs(preorder,0,0,inorder.length-1,map);
}
public TreeNode dfs(int preorder[],int i,int left,int right,HashMap<Integer,Integer> map ){
if(left>right){
return null;
}
TreeNode root=new TreeNode(preorder[i]);
int temp=map.get(preorder[i]);
root.left=dfs(preorder,i+1,left,temp-1,map);
root.right=dfs(preorder,i+temp-left+1,temp+1,right,map);
return root;
}