输入某二叉树的前序遍历和中序遍历的结果重建出该二叉树。设输入的前序遍历和中序遍历的结果中都不含重复的数字。如输前序{1,2,4,7,3,5,6,8}和中序{4,7,2,1,5,3,8,6},则重建。

/* 先序遍历第一个位置肯定是根节点node,
 
  中序遍历的根节点位置在中间p,在p左边的肯定是node的左子树的中序数组,p右边的肯定是node的右子树的中序数组
 
  另一方面,先序遍历的第二个位置到p,也是node左子树的先序子数组,剩下p右边的就是node的右子树的先序子数组
 
  把四个数组找出来,分左右递归调用即可
 
*/
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) 
    {
        TreeNode root=null;
        if(pre.length!=0)
         {
            	root=new TreeNode(pre[0]);
             	int []prel=null;
            	int	[]prer=null;
            	int	[]inl=null;
             	int	[]inr=null;
            for(int i=0;i<in.length;i++)
                {
               	 	 if(in[i]==pre[0])
                    {
                 	  prel=new int[i];
                 	 prer=new int[pre.length-i-1];    
                 	 inl=new int[i];
                 	 inr=new int[in.length-i-1];
                		
                    	 for(int a=0;a<i;a++)
                             prel[a]=pre[a+1];
                		for(int b=0;b<prer.length;b++)
                             prer[b]=pre[b+i+1];
                		for(int c=0;c<i;c++)
                            inl[c]=in[c];
                            for(int d=0;d<inr.length;d++)
                             inr[d]=in[d+i+1];
                      break;
                     }
                 }
             root.left=reConstructBinaryTree(prel,inl);
             root.right=reConstructBinaryTree(prer,inr);
          }
        return root;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值