バイナリツリーの再構築
そして、バイナリツリーの再構築の先行順走査でのバイナリツリーの先行順走査で結果を入力してください。仮定結果先行順トラバーサル順序と重複する数字の入力は無料です。入射例えばプレオーダートラバーサルシーケンス{1,2,4,7,3,5,6,8}及び{4,7,2,1,5,3,8,6}順序トラバーサル順序、及び再構成された二分木前リターン。
問題解決のアイデア:
先行順走査の特性は、最初の数字は、ルートノードを表します。根において見出さ順序トラバーサル順に、ツリーのルートの最初の部分は、右サブツリーに属し、後者は、左の部分木です。
ルートノードは、左サブツリー・ノードの数を決定し、トラバース配列INORDERマークされ、前のシーケンスの先行予約に基づいてノードの右の部分木の数は、左と右の部分木で選択した値をとります。
その後、使用再帰をすることができます。
再帰基本的な状況:二つの配列が空のときにコードがカバーされている、それは基本的な状況です。ヌルを返します。
1 / ** 2 バイナリツリーの定義* 3 *パブリッククラスツリーノード{ 4 ; * INTのヴァル 5 *のTreeNodeは左。 6 *のTreeNode右; 7 *ツリーノード(INT X){ヴァル= X。} 8 *} 9 * / 10 インポートjava.util.Arrays。 11 パブリック クラスソリューション{ 12 公共のTreeNode reConstructBinaryTree(INT []予め、INT {[]内) 13 // 递归基本条件 14 であれば(pre.length == 0 || in.length == 0 ) 15 リターン NULL ; 16 // 最初のルートノードを決定する 17。 ツリーノードルート= 新しい新しいツリーノードが(PRE [0 ]); 18である // ルートシーケンスの先行予約を見つける 19。 ために(INT I = 0; I <in.length。 ++ I ){ 20は IF([I] == [0を予備]){ 21は root.left = reConstructBinaryTree( 22は Arrays.copyOfRange(I +、,. 1を事前。1)、Arrays.copyOfRange(0、で、I ) 23である ); 24 root.right = reConstructBinaryTree( 25 Arrays.copyOfRange(前、私は+ 1、pre.length)、Arrays.copyOfRangeは、(i + 1、で、in.length) 26 ); 27 BREAK ; // なぜなら、より安全を感じることなく、ほぼ思えるしました私が知りたい 28 } 29 } 30 リターンルートを; 31 } 32 }