剑指offer系列——4.重建二叉树——前序中序确定树/中序后序确定树

Q:给出一棵树的前序遍历和中序遍历,请构造这颗二叉树
注意:
可以假设树中不存在重复的节点
A:

    public TreeNode buildTree(int[] preorder, int[] inorder) {
        int prelen=preorder.length;
        int inlen=inorder.length;
        return BT(preorder,0,prelen-1,inorder,0,inlen-1);
    }
    TreeNode BT(int[] preorder,int prestart,int preend,int[] inorder,int instart,int inend)
    {
        if(instart>inend)
            return null;
        TreeNode root=new TreeNode(preorder[prestart]);
        int mid=0;
        for(mid=instart;mid<=inend;mid++)
            if(inorder[mid]==root.val)
                break;
        int leftlen=mid-instart;
        root.left=BT(preorder,prestart+1,prestart+leftlen,inorder,instart,mid-1);
        root.right=BT(preorder,prestart+leftlen+1,preend,inorder,mid+1,inend);
        return root;
    }

Q:给出一棵树的中序遍历和后序遍历,请构造这颗二叉树
注意:
保证给出的树中不存在重复的节点
A:

    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder==null||postorder==null||inorder.length==0||postorder.length==0||postorder.length!=inorder.length){
            return null;
        }
        int in=inorder.length-1;
        int post=postorder.length-1;
        return solve(inorder,0,in,postorder,0,post);
    }
    //x,y分别代表中序遍历起始、结束位置,i,j分别代表后序遍历起始、结束位置
    public TreeNode solve(int[] inorder,int x,int y,int[] postorder,int i,int j){
        if(x>y||i>j){
            return null;
        }
        TreeNode root=new TreeNode(postorder[j]);
            for(int k=x;k<=y;k++){
                if(inorder[k]==postorder[j]){
                    //k-x代表中序遍历中根节点的左子树长度
                    root.left=solve(inorder,x,k-1,postorder,i,i+k-x-1);
                    root.right=solve(inorder,k+1,y,postorder,i+k-x,j-1);
                }   
            }   
        return root;
    }
posted @ 2020-01-28 20:21  Shaw_喆宇  阅读(157)  评论(0编辑  收藏  举报