体会递归思想
public class ReTree {
public static void main(String[] args) {
int[] a=new int[]{1,2,4,7,3,5,6,8};
int[] b=new int[]{4,7,2,1,5,3,8,6};
TreeNode node=new ReTree().reConstructBinaryTree(a, b);
node.prePrint(node);//1 2 4 7 3 5 6 8
node.inPrint(node);//4 7 2 1 5 3 8 6
// node.lastPrint(node);
}
//重建二叉树的函数;根据前序和中序
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];
}
for(int j=0;j<i;j++){
ino[j]=in[j];
}
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++){
ino[j-i-1]=in[j];//从0-开始到len-j长度
pr[j-i-1]=pre[j];
}
root.right=reConstructBinaryTree(pr,ino);
}else{
root.right=null;
}
return root;
}
}
class TreeNode
{
int val;
public TreeNode(int a) {
val=a;
}
TreeNode left;
TreeNode right;
public void prePrint(TreeNode node)
{
if(node==null)
{
return;
}
System.out.print(node.val+" ");
prePrint(node.left);
prePrint(node.right);
}
public void inPrint(TreeNode node)
{
if(node==null)
{
return;
}
inPrint(node.left);
System.out.print(node.val+" ");
inPrint(node.right);
}
public void lastPrint(TreeNode node)
{
if(node==null)
{
return;
}
lastPrint(node.left);
lastPrint(node.right);
System.out.print(node.val+" ");
}
}