题目来源:剑指offer
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:
前序序列第一个字母一定是根节点,在中序遍历序列中找到根节点的位置(不存在重复),该节点将中序遍历分为左右子树,递归调用
public class J_chongjianerchashu {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
if (pre.length==0){
return null;
}
int location=0;
TreeNode root=new TreeNode(pre[0]);
if (pre.length==1)
return root;
int i=0;
for (;i<in.length;i++){
if (in[i]==pre[0])
{location=i;
break;}
}
// root.left=new TreeNode(pre[2]);
// root.right=new TreeNode(pre[location+1]);
if (location==in.length-1) {
int lefp[] = new int[location];//定义左前徐子序列
int lp = 1;
for (int k = 0; k < lefp.length; k++) {
lefp[k] = pre[lp];
lp++;
}
int lefti[] = new int[location];//定义左中序子序列
int li = 0;
for (int k = 0; k < lefti.length; k++) {
lefti[k] = in[li];
li++;
}
root.left = reConstructBinaryTree(lefp, lefti);
}
if (location==0){
int rp=location+1;
int rightp[]=new int[pre.length-i-1];//定义右前序子序列
for (int k=0;k<rightp.length;k++){
rightp[k]=pre[rp];
rp++;
}
int righti[]=new int[in.length-1-i];//定义右中序子序列
int ri=location+1;
for (int k=0;k<righti.length;k++){
righti[k]=in[ri];
ri++;
}
root.right=reConstructBinaryTree(rightp,righti);
}
if (0<location&&location<in.length){
int lefp[] = new int[location];//定义左前徐子序列
int lp = 1;
for (int k = 0; k < lefp.length; k++) {
lefp[k] = pre[lp];
lp++;
}
int lefti[] = new int[location];//定义左中序子序列
int li = 0;
for (int k = 0; k < lefti.length; k++) {
lefti[k] = in[li];
li++;
}
root.left = reConstructBinaryTree(lefp, lefti);
int rp=location+1;
int rightp[]=new int[pre.length-i-1];//定义右前序子序列
for (int k=0;k<rightp.length;k++){
rightp[k]=pre[rp];
rp++;
}
int righti[]=new int[in.length-1-i];//定义右中序子序列
int ri=location+1;
for (int k=0;k<righti.length;k++){
righti[k]=in[ri];
ri++;
}
root.right=reConstructBinaryTree(rightp,righti);
}
System.out.println(root.val);
//System.out.println(root.right.val);
return root;
}
public static void main(String[] args) {
int re[]=new int[]{1,2,3,4,5,6,7};
int in[]=new int[]{3,2,4,1,6,5,7};
J_chongjianerchashu j=new J_chongjianerchashu();
j.reConstructBinaryTree(re,in);
}
//public TreeNode reConstruct(int nodeleft,int lenl,int noderight,int len2 ){}
}