オファー004-は、バイナリツリーを再構築受賞

トピック:

そして、バイナリツリーの再構築の先行順走査でのバイナリツリーの先行順走査で結果を入力してください。仮定結果先行順トラバーサル順序と重複する数字の入力は無料です。入射例えばプレオーダートラバーサルシーケンス{1,2,4,7,3,5,6,8}及び{4,7,2,1,5,3,8,6}順序トラバーサル順序、及び再構成された二分木前リターン。

アイデア:

プリアンブルシーケンスによると、ルート・ノードを検索します。

ルートノードの位置を見つけるためのシーケンスは、シーケンスは右半分と左半分に分割されています。

それぞれ再帰的な解決策は、サブツリー、右部分木、根への復帰を残しました。

時間計算:

O(nlogn)

再帰式によれば、T(N)= 2T(N / 2)+ O(N)

この問題は、問題の各サブスケールは、T(N / 2)であり、二つのサブ問題に分割されます。各ワークO(n)のサブ問題において、すなわち、ルートノードの位置を見つけます。

マスター定理の使用は、O(nlogn)を導入することができます

 

コード:

輸入java.util.Arrays。
/ ** 
 *バイナリツリーの定義
 *パブリッククラスのTreeNode { 
 * int型のval; 
 *のTreeNodeは左。
 *ツリーノードを右。
 *ツリーノード(INT X){ヴァル= X。} 
 *} 
 * / 
パブリック クラスソリューション{
     パブリック(ツリーノードreConstructBinaryTree INT []予め、INT {IN [])
        
        であれば(pre.length == 0 || in.length == 0 ){
             戻り ヌル
        } 
        
        ツリーノードのルート = 新しいツリーノード(プレ[0 ])。
        
        //] [中のルートの位置を見つける
        INT POS = 0 以下のためにINT ; I <in.length; iが0 = Iは++ ){
             場合(IN [I] ==事前[0 ]){ 
                POS = I。
            } 
        } 
 
        root.left = reConstructBinaryTree(Arrays.copyOfRange(プリ、1、1 + POS)、Arrays.copyOfRange(0、で)POS)。
        root.right = reConstructBinaryTree(Arrays.copyOfRange(プリ、1つの+ POS、pre.length)、Arrays.copyOfRange(中、POS + 1 、in.length))。
        
        リターンルート。
    } 
}

 

おすすめ

転載: www.cnblogs.com/zyrJessie/p/12590754.html