剑指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;
     
}
}
posted @ 2018-01-17 23:00  大熊好好写代码  阅读(570)  评论(0编辑  收藏  举报