输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重 复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
前序遍历的第一个节点是root,它可以将中序遍历的结果划分为两部分,左子树和右子树
根据中序遍历左子树和右子树的元素个数可以将前序序列划分为划分成左右子序列.
左右子树可递归生成最后重建二叉树
public TreeNode reBuildTree (int[]pre,int[]in) {
if (pre.length ==0 || in.length==0) {
return null;//空树
}
return reBuild(pre,0,pre.length-1,in,0,in.length-1);
}
public TreeNode reBuild (int[] pre,int preStart,int preEnd,int[] in,int inStart,int inEnd){
if (preStart > preEnd || inStart>inEnd) {
return null;
}
TreeNode root =new TreeNode(pre[preStart]);
int i = inStart;
for (;i<=inEnd;i++) {
if (in[i]==pre[preStart]) {//在中序遍历的结果中找根节点(前序遍历结果的第一个元素
//根据中序,我们能确定左子树的节点个数是i - instart
//所以从preStart+1连续上i-inStart个元素 就是左子树的前序序列
root.left = reBuild(pre,preStart+1,i-inStart+preStart,in,inStart,i-1);
root.right = reBuild(pre,preStart+1+i-inStart,preEnd,in,i+1,inEnd);
break;
}
}
return root;
}