【LeetCode105】Construct Binary Tree from Preorder and Inorder Traversal★★

1.题目

2.思路

 

3.java代码

//测试
public class BuildTreeUsingInorderAndPreorder {
     public static void main(String[] args) {
            int[] preSort={1,2,4,7,3,5,6,8};
            int[] inSort={4,7,2,1,5,3,8,6};
            System.out.println(new Solution().buildTree(preSort, inSort));
        }
}
//利用前序和中序重建二叉树
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        //参数校验
        if(preorder==null||inorder==null||preorder.length!=inorder.length||preorder.length==0) 
            return null;
        return buildTreeCore(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
    }
    /**
     * 构建二叉树,数据输入的正确性由输入数据自己保证
     *
     * @param preorder                    先序遍历的结果
     * @param startPreorder  先序遍历的开始位置
     * @param endPreorder    先序遍历的结束位置
     * @param inorder        中序遍历的结果
     * @param startInorder   中序遍历的开始位置
     * @param endInorder     中序遍历的结束位置
     * @return 二叉树的根结点
     */
    private TreeNode buildTreeCore(int[] preorder, int startPreorder, int endPreorder, 
        int[] inorder,int startInorder, int endInorder) {
        // 只有一个元素时直接返回该节点,这也是递归结束的出口标志
        if(startPreorder==endPreorder){
            return new TreeNode(preorder[startPreorder]);
        }else{
            // 记录根结点的在中序遍历中的位置
            int rootIn=startInorder;
            for(int i=startInorder;i<=endInorder;i++){
                if(inorder[i]==preorder[startPreorder]){
                    rootIn=i;
                    break;
                }
            }
            // 创建根结点
            TreeNode root=new TreeNode(inorder[rootIn]);
             // 左子树的结点个数
            int leftLength=rootIn-startInorder;
            if(leftLength>0){
                // startPreorder+1, startPreorder+leftLength:左子树在前序序列中的起始和结束位置
                root.left=buildTreeCore(preorder, startPreorder+1, startPreorder+leftLength, inorder, startInorder, rootIn-1);
            }
            // 右子树的结点个数
            int rightLength=endInorder-rootIn;
            if(rightLength>0){
                // startPreorder+leftLength+1, endPreorder:左子树在前序序列中的起始和结束位置
                root.right=buildTreeCore(preorder, startPreorder+leftLength+1, endPreorder, inorder, rootIn+1, endInorder);
            }
            return root;
        }
    }
}
//二叉树节点定义
class TreeNode {
     int val;
     TreeNode left;
     TreeNode right;
     TreeNode(int x) { val = x; }
}

 

posted @ 2017-03-16 11:21  追梦boy  阅读(168)  评论(0编辑  收藏  举报