题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
用的是递归,每次递归构建左右子树,然后返回根节点,用哈希表先把里面的节点存起来方便后面查找,由于Java传对象都是传的地址,所以不会耗费很多空间和时间,可能参数多了点,还有参数栈会出入频繁一些
import java.util.Map;
import java.util.HashMap;
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length==0||in.length==0)
return null;
else{
Map<Integer,Integer> preMap=new HashMap<>();
Map<Integer,Integer> inMap=new HashMap<>();
for(int i=0;i<pre.length;++i)
preMap.put(pre[i],i);
for(int i=0;i<in.length;++i)
inMap.put(in[i],i);
return reConstructSubBinaryTree(pre,preMap,0,pre.length-1,in,inMap,0,in.length-1);
}
}
public TreeNode reConstructSubBinaryTree(int[] pre,Map<Integer,Integer> preMap,int preStart,int preEnd,int[] in,Map<Integer,Integer> inMap,int inStart,int inEnd){
if(preStart>preEnd||inStart>inEnd||!inMap.containsKey(pre[preStart]))
return null;
TreeNode root=new TreeNode(pre[preStart]);
int inLocate=inMap.get(pre[preStart]);
root.left=reConstructSubBinaryTree(pre,preMap,preStart+1,preStart+inLocate-inStart,in,inMap,inStart,inLocate-1);
root.right=reConstructSubBinaryTree(pre,preMap,preStart+inLocate-inStart+1,preEnd,in,inMap,inLocate+1,inEnd);
return root;
}
}