トピック:
そして、バイナリツリーの再構築の先行順走査でのバイナリツリーの先行順走査で結果を入力してください。仮定結果先行順トラバーサル順序と重複する数字の入力は無料です。入射例えばプレオーダートラバーサルシーケンス{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))。 リターンルート。 } }