输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路:这种二叉树的问题最好画图来解决,比较直观。先画出它的图像先
先序遍历:遍历顺序规则为【根左右】
中序遍历:遍历顺序规则为【左根右】
后序遍历:遍历顺序规则为【左右根】
如上图所示,在前序遍历的序列中第一个就是树的根结点,此时再在中序遍历的序列里查找这个根结点,则中序遍历的序列里根结点左侧的就是左子树,右侧的就是右子树,再对左右子树进行同样的操作,此时可以使用递归实现,这样便能构造出这个二叉树。
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
TreeNode root=new TreeNode(pre[0]); //定义新的种子点,即先序的第一个值
int len=pre.length;
//当只有一个数的时候
if(len==1){
root.left=null;
root.right=null;
return root;
}
//找到中序中的根位置
int rootVal=root.val;
int i;
for(i=0;i<len;i++){
if(rootVal==in[i]){
break;
}
}
//创建左子树
if(i>0){
int[] pr=new int[i];
int[] ino=new int[i];
for(int j=0;j<i;j++){
pr[j]=pre[j+1]; //把pre里的2、4、7给新的子树
ino[j]=in[j]; //把in里的4、7、2给新的子树
}
root.left=reConstructBinaryTree(pr,ino);
}else{
root.left=null;
}
if(len-i-1>0){
//创建右子树
int[] pr=new int[len-i-1];
int[] ino=new int[len-i-1];
for(int j=i+1;j<len;j++){
pr[j-i-1]=pre[j]; //把pre里的3、5、6、8给新的子树
ino[j-i-1]=in[j]; //把in里的5、3、8、6给新的子树
}
root.right=reConstructBinaryTree(pr,ino);
}else{
root.right=null;
}
return root;
}
}