LeetCode--配列決意ツリー決意ツリープリアンブルシーケンス/順序の後

Q:前順走査を与え、ツリーのトラバースINORDER、Zhekeバイナリー構築
注:
ツリーのない複製ノードが存在しないと仮定することができ
、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:与えられたシーケンス先行順木のトラバーサルとリア、Zhekeバイナリ構築
注:
保証ツリーが重複ノード与えられていない
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;
    }

おすすめ

転載: www.cnblogs.com/xym4869/p/12517826.html