题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
//pre前序,in中序
if(pre==null||in==null){
return null;
}
//创建一个HashMap数组
java.util.HashMap<Integer,Integer> map= new java.util.HashMap<Integer, Integer>();
//将中序的遍历放入map中
for(int i=0;i<in.length;i++){
//这样通过值可以找到索引位置
map.put(in[i],i);
}
return preIn(pre,0,pre.length-1,in,0,in.length-1,map);
}
private TreeNode preIn(int[] p,int pi,int pj,int[] n,int ni,int nj,java.util.HashMap<Integer,Integer> map){
if(pi>pj){
return null;
}
//取出前序遍历的头结点,作为根节点。
TreeNode head=new TreeNode(p[pi]);
//找到根节点在中序遍历中的索引位置
int index=map.get(p[pi]);
//递归进行查找左右节点。
head.left=preIn(p,pi+1,pi+index-ni,n,ni,index-1,map);
head.right=preIn(p,pi+index+1-ni,pj,n,index+1,nj,map);
return head;
}
}