【原题】 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 【思路】 今天捡起之前一直没有ac的一道题,这道题显然是用递归的方法求解。十分钟过去,没有调试,竟然就 通过了,也是神奇。仔细看了以前提交的多次不通过的代码,思路其实是一样的,主要在于长度,递归的起止位置要特别小心,已经作为根结点的index就不用包含在下一次的递归序列当中。最好以一个栗子来手动演示一下。
public class Solution {
public TreeNode reConstructBinaryTreeCore(int[] pre,int preStart,int preEnd,
int[] in,int inStart,int inEnd){
if(preEnd-preStart<=0||inEnd<=inStart) return null;
TreeNode root=new TreeNode(pre[preStart]);
int mid=inStart;
//以前序第一个结点为根结点,在中序序列中找到该节点的位置,即可以递归构建左右子树
for(int i=inStart;i<inEnd;i++)
if(in[i]==pre[preStart]){
mid=i;break;
}
int leftLen=mid-inStart;
int rightLen=inEnd-mid;
root.left=reConstructBinaryTreeCore(pre,preStart+1,preStart+1+leftLen,in,inStart,mid);//递归构建左子树
root.right=reConstructBinaryTreeCore(pre,preStart+leftLen+1,preEnd,in,mid+1,inEnd);//递归构建右子树
return root;
}
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if(pre.length!=in.length) return null;
return reConstructBinaryTreeCore(pre,0,pre.length,in,0,in.length);
}
}