关于重建二叉树问题已经二叉树前序排列和中序排列求二叉树

 package DataStructure; 



import java.util.ArrayList;
import java.util.List;


public class niukewang {



/*    
* 本地解决的是二叉树已经前序排列中序排列求二叉树


* 并且已经序列中不存在val相等的节点
* 每个节点都是唯一的一个


*/
   

/*
* 基础
* 1了解什么是前序排列
* 2了解什么是后序排列 
*  
*  
* 方法核心即
*   前序排列的第一个元素为root 
*   在中序排列中找到root对应的位置记住为  i
*   那么中序排列中i的左边为root的左子树
*   右边为右子树  
*   
*   此时根据左子树的中序排列和前序排列查找左子树的root
*   遍历前序中的元素第一个出现在左子树中序列中的元素即为root
*   不断递归即可求解书
*   
*   
*    
*   

*/
 public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
       
     
 TreeNode root=null;
 
       if(in.length==0)//中序为空
        return null;
   if(in.length==1)//中序为长度1时此点即为root点
   {
    root=new TreeNode(in[0]);
    System.out.println(root);
    return root;
   }
   
   if(in.length==pre.length)//初始状态前序中序长度一致  前序第一个为根节点
    root =new TreeNode(pre[0]);
    else {
    //子树操作过程
    for(int j=0;j<pre.length;j++)//遍历前序查找在中序中第一个相等的数作为root
{
    for(int i=0;i<in.length;i++)
{
if(in[i]==pre[j])
{
root=new TreeNode(in[i]);
break;
}

}

if(root!=null)
break;
}
}
    
   int []  lefin = null;   //左子树中序
   int []  rightin = null;//右子树中序
       
       
          for(int i=0;i<in.length;i++)
          
          {
          
          if( root.val == in[i])
          {
          
          lefin=new int[i];
          rightin=new int[in.length-1-i];
          System.arraycopy(in, 0, lefin, 0,i);
          
          System.arraycopy(in, i+1, rightin, 0, in.length-1-i);
          
          
          
          }
          
          }
 
          System.out.println(root);
          
          root.left=reConstructBinaryTree(pre, lefin);
          root.right=reConstructBinaryTree(pre, rightin);
          return root;
      
         
       
       
   }  
     
       
   
public static void main(String[] args) {


System.out.println( reConstructBinaryTree(new  int[]{1,2,4,3,5,6},new int []{4,2,1,5,3,6}));

    



}


}




class TreeNode {
 public TreeNode(){};
   int val;
   TreeNode left;
   TreeNode right;
   TreeNode(int x) { val = x; }
   public String toString(){
return val+"";
   
   
   
   }
   
   
   
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值