バイナリツリー内のすべてのキーが明確な正の整数であると仮定します。後順とトラバーサルシーケンスINORDERを考えると、あなたは、対応するバイナリツリーの出力レベル順トラバーサル順序になっています。
入力仕様:
各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、正の整数与える N(≤)、バイナリツリー内のノードの総数。2行目は、後順のシーケンスを与え、第三の線がINORDER配列を与えます。行のすべての数字は、スペースで区切られます。
出力仕様:
各テストケースのために、一列に対応するバイナリツリーのレベル順トラバーサル順序を印刷します。行のすべての数字は正確に一つのスペースで区切らなければならず、行の最後に余分なスペースがあってはなりません。
サンプル入力:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
サンプル出力:
4 1 6 3 5 7 2
既知の先行順走査順序と出力層の前順
1の#include <iostreamの> 2の#include <キュー> 3。 使用した 名前空間STD; 4 INT * POS、ORD *; // ストレージおよび配列先行順データの後 5 構造体ノード 6 { 7。 INT ヴァル; 8 ノードのL *、* R&LT; 9。 ノード(INT A = 0 ):ヴァル(A)、L(nullptr A)は、R(nullptr A){} 10 }; 11ノード* createTree(INT POSL、INT POSR、INT ordL、INT ORDR) 12は、 { 13れます IF(POSL> POSR) 14 リターンnullptr; 15 ノード* =ルート新しい新しいノード(); 16 ディレクトリroot->ヴァルPOS = [POSR]; // ルート値 17。 int型のK; 18である ため(K = ordL; K <= ORDR; ++ K)が 19 { 20 IF(ORD [K] == POS [POSR])// 元見つけるためにツリーのルート 21は BREAK 、 22である } 23は、 INT ; - ordL numL = K // 左側のサブツリーノードの数 24 // 再帰的な建設左のサブツリー 25 ディレクトリroot-> L = createTree(POSL、POSL + numL -。1、ordL、K - 1。); 26である // 右の部分木の再帰構造 27 ディレクトリroot-> = R&LT createTree(POSL + numL、POSR - 1、K + 1、ORDR); // ルートを削除し 28 の戻りルートを、 29 } 30 空隙 getResBFS(ノード* ルート) 31である { 32 キュー<ノード*> Q; 33である P = *ノードnullptr A; 34である q.push(ルート); 35 COUT <<ディレクトリroot-> ヴァル; 36 ながら(!q.empty ()) 37 { 38 P = q.front()。 39 もし(!P = ルート) 40 はcout << " " << P-> valの; 41 q.pop()。 42 であれば(P-> L =!nullptr) 43 q.push(P-> L)。 44 であれば(P-> R =!nullptr) 45 q.push(P-> R) 46 } 47 COUT << ENDL。 48 } 49 50 のint main()の 51 { 52 INT N。 53 cinを>> N。 54台の POS = 新しい INT [N]。 55 ORD = 新しい INT [N]。 56 のために(int型 I = 0 ; iがNを<; ++ I) 57 CIN >> POS [I]。 58 のために(int型 I = 0 ; iがNを<; ++ I) 59 CIN >> ORD [I]。 60 ノード*ルート= createTree(0、N - 1、0、N - 1 )。 61 getResBFS(ルート)。 62 リターン 0 ; 63 }