トピック:
そして、バイナリツリーの再構築の先行順走査でのバイナリツリーの先行順走査で結果を入力してください。仮定結果先行順トラバーサル順序と重複する数字の入力は無料です。入射例えばプレオーダートラバーサルシーケンス{1,2,4,7,3,5,6,8}及び{4,7,2,1,5,3,8,6}順序トラバーサル順序、及び再構成された二分木前リターン。
分析:
そして、バイナリツリー、バイナリツリーの再構築のプリアンブルINORDERトラバーサルによります。
我々はそれを知っています:
前順走査:ルート、左サブツリー、右のサブツリー。
予約限定:左の部分木、根、右のサブツリー。
後順:左サブツリー、右部分木、ルートノード。
左サブツリーが左であり、右に応じて、右の部分木であり、最初の数字が順トラバーサル全体数の先行トラバーサル、この数がルートノードであり、順にアレイは、2つの部分に分割見出すことができます左右のサブツリーの外に刻まれた、私たちは、あなたが再帰的にこの問題を解決することができるようにすることを、左と右のサブツリー配列の最初の要素を表示するには、事前に注文トラバーサルに戻ることができます。
私たちは、それぞれの再帰実行が得意系列のインデックスを記録したい、これは私たちが左と右のインデックスがleftInとrightInで反復処理するためには、leftPre、rightPreとして記録配列のインデックスをトラバースする前奏曲について、サブインデックスの配列をとり、問題を解決するのに役立ちます。
要素がleftPreルートを指しているので、左の部分木の配列インデックスの先行順走査は、leftPre + 1残されます。
フラグが反復するために、インデックスのルート、及びFLAG-leftIn正確左サブツリー要素の数であり、プリアンブルの反復左サブツリーは、右インデックスleftPre +フラグleftInあります。
フラグは、我々は見つけるルート要素であるため、予約限定の配列インデックスはleftPreは左側に新しい自然の前順で配列され、サブツリーとフラグ-1を残しています。
アレイを通してプリアンブルインデックスは、左と右の部分木は左右のサブツリーを横断プリオーダーが接続されているため、左と右の部分木のインデックスは1だけインクリメントされるという事実にあるleftPre + FLAG-leftIn + 1です。rightPreは自然に右の指標となりました。
プレオーダー配列インデックスは、右サブツリーフラグ+ 1とrightInあります。
インデックスがマップ内に堆積したときに、時間の複雑さを軽減することができます直接アクセスを必要とする場合でも、ルート・ノードを見つけるために、配列のインデックスをトラバースするために、毎回の解決、我々は、開始することができます。
手順:
C ++
クラス解決{ パブリック: ツリーノード * reConstructBinaryTree(ベクトル< 整数 >予め、ベクトル< INT > VIN){ 戻りヘルパー(PRE、VIN、0、pre.size() - 1、0、vin.size() - 1 )。 } ツリーノード *ヘルパー(ベクトル< INT >&プレオーダー、ベクトル< INT >&INORDER、INT leftPre、INT rightPre、INT leftIn、INT rightIn){ 場合(leftPre> rightPre) リターンnullptr; ツリーノード *ルート= 新しいツリーノード(先行順[leftPre]); もし(leftPre == rightPre) リターンルート。 他の{ int型私= leftIn。 用(; I <= rightIn; ++ I){ 場合(INORDER [I] == プレオーダー[leftPre]) ブレーク。 } ルート - >左=ヘルパー(プレオーダー、INORDER、leftPre + 1、leftPre + I-leftIn、leftIn、I- 1 )。 ルート- >右=ヘルパー(プレオーダー、INORDER、leftPre + I + 1 -leftIn、rightPre、I + 1 、rightIn)。 リターンルート。 } } }。
ジャワ
// HashMapの使用 インポートのjava.util.HashMapを。 パブリック クラスソリューション{ 公共のTreeNode reConstructBinaryTree(INT []予め、INT {[]内) 地図 = 新規 HashMapの<> (); 以下のために(INT I 0 =; I <in.length; ++ I){ map.put([I]において、I)。 } 戻りヘルパー(前、中、0、pre.length-1、0、in.length-1 )。 } パブリックツリーノードヘルパー(INT []プレオーダー、INT [] INORDER、INT leftPre、INT rightPre、INT leftIn、INT rightIn){ 場合(leftPre> rightPre) リターン ヌル。 ツリーノードのルート = 新しいツリーノード(プレオーダー[leftPre])。 もし(leftPre == rightPre) リターンルート。 他{ INT I = map.get(プレオーダー[leftPre])。 root.left =ヘルパー(プレオーダー、INORDER、leftPre + 1、leftPre + I-leftIn、leftIn、I-1 )。 root.right =ヘルパー(先行順、inorderを、leftPre + I-leftIn + 1、rightPre、I + 1、rightIn)。 リターンルート。 } } プライベートのHashMap <整数、整数> マップ。 }