leetcode105. 从前序与中序遍历序列构造二叉树

 递归 开心 二叉树 前序遍历 中序遍历 构造树

  1. 从前序与中序遍历序列构造二叉树
    根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出:

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树
   3
  /   \
 9   20
  /     \
15     7

/**
* Definition for a binary tree node.
* public class TreeNode {
*     int val;
*     TreeNode left;
*     TreeNode right;
*     TreeNode(int x) { val = x; }
* }
*/
class Solution {
 public TreeNode buildTree(int[] a, int[] b) {
     if(a.length==0||b.length==0){
         return null;
     }
     return comodTree(a,b,0,a.length-1,0,b.length-1);
 }
 TreeNode comodTree(int a[],int b[],int abegin,int aend,int bbegin,int bend){        //递归分解

     TreeNode treeNode=new TreeNode(a[abegin]);          //保留头节点
     int recordRoot=-1;
     for(int i=bbegin;i<=bend;i++){                  //在中序遍历中查看头节点
         if(a[abegin]==b[i]){
             recordRoot=i;
         }
     }
     int leftLength=recordRoot-bbegin;           //左子树的度
     int rightLength=bend-recordRoot;            //右子树的度
     //System.out.println(leftLength +"      "+rightLength);
     if(leftLength<=0){                            //如果左子树的度小于1的话
         treeNode.left=null;
     }else if(leftLength==1){                    //如du果左子树的度大于1的话
         treeNode.left=new TreeNode(b[recordRoot-1]);
     }else{
         TreeNode treeNodeLeft=comodTree(a,b,abegin+1,abegin+leftLength,bbegin,recordRoot-1); //递归查找
         treeNode.left=treeNodeLeft;         //将左子树赋值给根节点的left
     }
     if(rightLength<=0){                 //右子树同理
         treeNode.right=null;
     }else if(rightLength==1){
         treeNode.right=new TreeNode(b[recordRoot+1]);
     }else{
         TreeNode treeNodeRight=comodTree(a,b,abegin+leftLength+1,aend,recordRoot+1,bend);
         treeNode.right=treeNodeRight;
     }

     return treeNode;                //返回根节点
 }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值