输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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 {
//pre是前序,in是中序,前序做查找根,中序来递归
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre==null || in==null||pre.length!=in.length){
return null;
}
int n=pre.length;
return constructTree(pre,0,n-1,in,0,n-1);
}
private TreeNode constructTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn){
//建立根节点
TreeNode node=new TreeNode(pre[startPre]);
//判断递归结束条件
if(startPre==endPre){
if (startIn==endIn){
return node;
}
throw new IllegalArgumentException("Invaild Input");
}
int inOrder=startIn;
//判断pre找到的根,在in里面有没有
while(in[inOrder]!=pre[startPre]){
++inOrder;
if(inOrder>endIn){
new IllegalArgumentException("Invaild Input");
}
}
//两个相减,只会剪掉一个边界
int len=inOrder-startIn;
if(len>0){
node.left=constructTree(pre,startPre+1,startPre+len,in,startIn,inOrder-1);
}
if(endIn-inOrder>0){
node.right=constructTree(pre,startPre+len+1,endPre,in,inOrder+1,endIn);
}
return node;
}
}