バイナリツリーを反転PATアドバンスト1102(25分)

以下は、マックス・ハウエル@twitterからです。

Google: 90% of our engineers use the software you wrote (Homebrew), but you can't invert a binary tree on a whiteboard so fuck off.
 

今、それはあなたがバイナリツリーを反転させることができることを証明するためにあなたの番です!

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、整数陽性を与え  N(したがってノードは、0から番号が付けられている- ≤)ツリー内のノードの総数である  N - そして1  Nラインがノードに、それぞれ相当に従っ0〜  N - 1、およびノードの左及び右の子のインデックスを与えます。子が存在しない場合は、  - 位置に置かれます。子供の任意のペアは、スペースで区切られます。

出力仕様:

各テストケースのために、2行目に、次いで逆ツリーのインオーダートラバーサルシーケンスを最初の行レベル順で印刷、および。正確に一つの隣接する任意の数字の間のスペース、および行の末尾に余分なスペースがなければなりません。

サンプル入力:

8
1 -
- -
0 -
2 7
- -
- -
5 -
4 6
 

サンプル出力:

3 7 2 6 4 0 5 1
6 5 7 4 3 2 0 1

この問題は、ノード左の子と右の子与えられた順番であり、バイナリツリートラバーサルシーケンスと前順を見つけるために引き渡されました。

私たちは、インデックスに応じて実施し、最大から最小まで、小から大までレベルに応じて行うの並べ替えを使用して、その後、ビルドツリートラバーサルシーケンスを使用することができます。バイナリツリートラバーサル順序を逆にすることができます。

最後の印刷

#include <iostreamの> 
する#include < ストリング > 
の#include <ベクトル> 
の#include <アルゴリズム>
 使用して 名前空間STDを。
構造体ノード{
     int型のインデックス、ID、=左- 1、右= - 1 、レベル。
} [ 100 ]。
int型N; 
ベクターの<node> V。
BOOL CMP(ノード&N1、ノード・N2){
     リターン n1.level == n2.level?n1.index> n2.index:n1.level < n2.level。
} 
無効 DFS(int型根、int型インデックス、INT レベル){
     場合([ルート] .RIGHT =! - 1)DFS([根] .RIGHT、指数* 2 + 2、レベル+ 1 )。
    v.push_back({インデックス、根、00 、レベル})。
    もし([ルート] .LEFT =! - 1)DFS([根] .LEFT、指数* 2 + 1、レベル+ 1 )。
} 
int型のmain(){ 
    CIN >> N。
    文字列tmp_l、tmp_r。
    ベクター < BOOL > find_rootは(N)。
    にとってINT I = 0、I <N; I ++ ){ 
        CIN >> tmp_l >> tmp_r。
        [I] .ID = I。
        もし(tmp_l =!" - " ){ 
            [I] .LEFT = STOI(tmp_l)。
            find_rootは[STOI(tmp_l)] = 
        } 
        であれば(tmp_r =!" - " ){ 
            [I] .RIGHT = STOI(tmp_r)。
            find_rootは[STOI(tmp_r)] = 
        } 
    } 
    int型root_index;
    以下のためにint型私は= 0 ; I <Nを、私は++ の場合(find_rootは[i]が!)root_index = I; 
    DFS(root_index、00 ); 
    ベクター <ノード> V2(V)。
    ソート(v2.begin()、v2.end()、CMP); 
    INTは iは= 0 ; I <N; I ++ 場合(!I = N- 1)COUT << V2 [i]は.ID << "  " 他の coutの<< V2 [i]は.ID << てendl;
    以下のためのint型 I = 0; I <N; I ++ の場合(I = N-!1)coutの<< V [i]は.ID << "  " ;
        他の coutの<< V [i]は.ID << てendl; 
    システム(一時停止)。
    リターン 0 ; 
}

 

おすすめ

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