以下は、マックス・ハウエル@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({インデックス、根、0、0 、レベル})。 もし([ルート] .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、0、0 ); ベクター <ノード> 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 ; }