PAT高度1020ツリー全検索(25分)

 

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 - 10、N- 1); 
    ツリーノード *ツリー= buildTree(00、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- 12 *指数+ 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 - 10、N- 10 ); 
    ソート(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 ; 
}

 

おすすめ

転載: www.cnblogs.com/littlepage/p/11672360.html