首页 > 其他 > 详细

剑指offer_重构二叉树

时间:2018-01-18 00:01:26      阅读:206      评论:0      收藏:0      [点我收藏+]

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

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

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

                       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;
     
}
}

剑指offer_重构二叉树

原文:https://www.cnblogs.com/ChenXionghfut/p/8306683.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!