重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:根据前序遍历和中序遍历的特点,以题目当中的输入为例,1为根节点,再到中序遍历当中找根节点,找到之后左边为左子树4、7、2,右边为右子树5、3、8、6,再分别对左右子树继续这个过程,直到节点的左右子树为空。

    public static TreeNode recons(List<Integer> pre,List<Integer> in){
        if(pre.size()==0||in.size()==0)
            return null;
        TreeNode root=new TreeNode(pre.get(0));
        int des=in.indexOf(pre.get(0));
        List<Integer> preLeft=new ArrayList<Integer>(pre.subList(1, des+1));//左子树前序遍历
        List<Integer> inLeft=new ArrayList<Integer>(in.subList(0, des));//左子树中序遍历
        List<Integer> preRight=new ArrayList<Integer>(pre.subList(des+1, pre.size()));//右子树前序遍历
        List<Integer> inRight=new ArrayList<Integer>(in.subList(des+1, in.size()));//右子树中序遍历

        root.left=recons(preLeft,inLeft);
        root.right=recons(preRight,inRight);

        return root;
    }
posted @ 2016-05-02 19:05  黄大仙爱编程  阅读(77)  评论(0编辑  收藏  举报