1020のツリー全検索(25分)
バイナリツリー内のすべてのキーが明確な正の整数であると仮定します。後順とトラバーサルシーケンス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
主なテスト、横断成果の前に、転送プリアンブルを通過した後、ツリートラバーサルシーケンス
書式#include <iostreamの> の#include <ベクトル> の#include <キュー> 使用して名前空間はstdを、構造体のTreeNode { int型のval; ツリーノード * 左; ツリーノード * 右; }。 ベクトル < 整数 >前、中、後の、ANS; キュー <TreeNodeの*> QUE。ボイドプレオーダー(int型のルート、int型開始、INT 端){ 場合(スタート>終了)リターン。 int型私= 0 ; 一方、(私は=最後の<&& で [I] =ポスト[ルート]!)私は++します; pre.push_back(ポスト[ルート])。 プレオーダー(ルート - 1末端+ I、開始、I- 1 )。 プレオーダー(根 - 1、I + 1 、エンド)。 } ツリーノード * buildTree(INTのルート、int型開始、INT 端){ 場合(スタート>終了)リターンNULL。 int型私= 0 ; ツリーノード *トン= 新しいのTreeNode(); 一方(iは=端の<&& で[I] =前[ルート])は、i ++! 。 T - >ヴァル= プレ[ルート]。 T - >左= buildTree(ルート+ 1、起動、I- 1 )。 T - >右= buildTree(ルート+ 1 + I-開始、I + 1 、エンド)。 返すトンを。 } ボイド LEVELORDER(ツリーノード*のツリー){ que.push(木) しばらく(!que.empty()){ のTreeNode * TMP = que.front(); ans.push_back(TMP - > val)で、 que.pop(); もし(!tmp->左= NULL)que.push(tmp-> 左)。 もし(!tmp->右= NULL)que.push(tmp-> 右)。 } } int型のmain() { int型のN。 scanf関数(" %のD "、&N)。 post.resize(N)。で.resize(N)。 以下のために(int型 i = 0 ; iがNを<; I ++)はscanf関数を(" %のD "、&ポスト[I])。 以下のために(int型私= 0 ; iがNを<; I ++)はscanf関数(" %のD "、&に[I])。 プレオーダー(N - 1、0、N- 1); ツリーノード *ツリー= buildTree(0、0、N- 1 )。 LEVELORDER(木)。 以下のために(int型私= 0 ;私は<ans.size();私は++ ) の場合(I = ans.size() - !1)coutの<< ANS [I] << " " ; 他の coutの<< ANS [i]は、 システム(「一時停止」)。 リターン 0 ; }
あなたが直接結果先行順走査を得ることができるように、あなたが実際に、インデックスを構築することができ、コードを変更し、劉神のブログを見ます:
書式#include <iostreamの> の#include <ベクトル> の#include <アルゴリズム> 使用して名前空間はstdを、 構造体ノード{ int型のインデックス。 int型のval; }。BOOL CMP(ノードN1、ノードN2){ 戻り n1.index < n2.index。 } ベクトル < 整数 > で、ポスト。 ベクター <ノード> ANS。空予約限定(int型の根、int型開始、int型エンド、int型のインデックス){ 場合(スタート>終了)リターン ; int型私= 0 ; 一方、(私は=最後の<&& で [I] =ポスト[ルート]!)私は++します; ans.push_back({インデックス、ポスト[ルート]})。 プレオーダー(ルート - 1末端+ I、開始、I- 1、2 *指数+ 1 )。 プレオーダー(根 - 1、I + 1、終了、2 *指数+ 2 )。 } int型のmain() { int型のN。 scanf関数(" %のD "、&N)。 post.resize(N)。で.resize(N)。 以下のために(int型 i = 0 ; iがNを<; I ++)はscanf関数を(" %のD "、&ポスト[I])。 以下のために(int型私= 0 ; iがNを<; I ++)はscanf関数(" %のD "、&に[I])。 プレオーダー(N - 1、0、N- 1、0 ); ソート(ans.begin()、ans.end()、CMP); 以下のために(int型 i = 0 ; iがNを<; I ++の) 場合(!I = N- 1)のprintf(" %dの"、ANS [I] .val)。 他のprintf(" %d個" 、ANS [I] .val)。 システム(「一時停止」)。 リターン 0 ; }