顔の質問は、バイナリツリーの再構築を6「安全プランを証明」

答え「安全プランを証明」、Javaのための分析とノートは
「プランを勝ち取る」6刻まれている:バイナリツリーの再構築(プリアンブルシーケンスからとバイナリツリーの順序は、バイナリツリーを再構築するために)

本方法は:私たちは、バイナリツリーを再構築したい、我々はルートと左の子ノードとルートノードの右の子を見つけるために続けなければなりません。ことに留意されたいプリアンブルシーケンスは、その最初の要素は、バイナリ要素がトラバースし、その左部分木の右の部分木の前順走査をプレオーダーバックに、ルートノードです。質問は今、プリアンブルシーケンスだけであれば、我々は唯一のルートを見つけることができますが、ある我々は二つのサブ配列の長さは知らない、私たちはサブツリーのルートと同じ方法を見つけるために続けることができなくなります。我々が必要このとき補助配列 - 配列順序は、我々は2つの配列の長さを決定することができるように、その特性に応じて、ルートノードは、配列の左右配列の中央になければなりません。

    public TreeNode build(int[] a, int[] b){
        if(a.length == 0){
            return null;
        }
        return build(a, 0, a.length-1, b, 0, b.length-1);
    }
    
    private TreeNode build(int[] a, int aStart, int aEnd, int[] b, int bStart, int bEnd){
        if(aStart > aEnd)return null;
        //构建根节点
        TreeNode root = new TreeNode(a[aStart]);
        //找到根节点在中序序列中的位置
        int partition = bStart;
        for(int i=bStart; i<=bEnd; i++){
            if(b[i] == a[aStart]){
                partition = i;
                break;
            }
        }
        //在左子序列中继续构建根节点
        root.left = build(a, aStart+1, aStart+1+partition-1-bStart,
                b, bStart, partition-1);
        //在右子序列中继续构建根节点
        root.right = build(a, aStart+partition-bStart+1, aEnd,
                b, partition+1, bEnd);
        //返回构建好的根节点
        return root;
        
    }

注:シーケンスの前と後の最初のシーケンスの最後の要素の後にシーケンスが常に配列を決定していないためにのみプリアンブルシーケンス+ +またはバイナリシーケンスの後続の再構成に使用される、プリアンブル・シーケンス+再構成された二分木は、一意ではありません最後にそれはまだ表現のサブツリー右部分木のフロント要素を残しています。例えば、<-2 <1、及び1-> 2-バイナリだけ右サブツリー> 3だけ左サブツリーバイナリ3、それらの配列とプリアンブルシーケンスは同じです。

おすすめ

転載: www.cnblogs.com/czjk/p/11589869.html