剑指offer_重构二叉树

      题目:输入某二叉树的前序遍历和中序遍历的结果,假设结果中不包含重复元素,请重建该二叉树。

              思路:前序:访问顺序:根-->左子树-->右子树

                        后序:访问顺序:左子树-->根-->右子树

                       1.要想重建一个序列的二叉树,就要知道每序列中每一个结点的左子树和右子树。

                       2.前序序列的第一个结点值就是根结点的值,根据这个根结点的值到遍历中序序列,找到这个结点,则这个结点的左边序列

                      为根的左子树,右边序列为根的右子树。

                     代码如下:

                        

/**
  * Definition for binary tree
  * public class TreeNode {
  *     int val;
  *     TreeNode left;
  *     TreeNode right;
  *     TreeNode(int x) { val = x; }
  * }
  */
public class Solution {
     public TreeNode reConstructBinaryTree( int [] pre, int [] in) {
         return reConstructBinaryTreeOne(pre, 0 ,pre.length- 1 ,in, 0 ,in.length- 1 );
         
     }
         
         private TreeNode reConstructBinaryTreeOne( int [] pre, int startPre, int endPre,
                              int [] in, int startIn, int endIn){
 
         //标明了什么时候跳出递归
         if (startPre>endPre||startIn>endIn)
             return null ;
                            //将当前输入的前序序列的第一个结点作为根结点,到输入的中序序列中找它的左子树和右子树
         TreeNode root= new TreeNode(pre[startPre]);
         for ( int i=startIn;i<=endIn;i++){
             if (pre[startPre]==in[i])
                                                         //根结点的左子树     
                 root.left=reConstructBinaryTreeOne(pre,startPre+ 1 ,i-startIn+startPre,in,startIn,i- 1 );
                                                        //根结点的右子树
                 root.right=reConstructBinaryTreeOne(pre,i-startIn+startPre+ 1 ,endPre,in,i+ 1 ,endIn);
             }}
         return root;
     
}
}

转载于:https://www.cnblogs.com/ChenXionghfut/p/8306683.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值