左フォーチュン法書「プログラマーコード面接ガイド」--3_02印刷バイナリ境界ノード[★★]

タイトル
バイナリツリーヘッドヘッドのノードが与えられると、次の2つの基準に従って、境界ノードバイナリカウンタ印刷を達成しました。
標準:
1.ヘッドノードは境界ノードです。
2.リーフノードは境界ノードです。
3.それが左端または右端である層内のノードは、その後、皮革はまた、境界点である場合。
二つの基準:
1.ヘッドノードは境界ノードです。
2.リーフノードは境界ノードです。
3.ツリー経路が境界ノードの左端の下に延びます。
4.ツリー経路を境界ノードとして右側境界を下に延びます。
例えば、図3 -図2木。

 

 

標準的な印刷結果は次のとおり1,2,4,7,11,13,14,15,16,12,10,6,3
結果に応じて標準的な2は印刷:1,2,4,7,13 、14,15,16,10,6,3は、
[必須]
ノードの数がNである場合、両方の規格の複雑さの要件が実装されている時間はO(N)である1、追加の空間の複雑さの要件はO(H)であります、hは二分木の高さです。
2. 2つの規格が反時計回りに、すべての境界ノードを印刷するために、請求項中に繰り返されていません。
【解決手段】
次のように印刷プロセスである特定の規格の要件に応じて実装:
1.得られた二分木左端と右端ノードの各層。例のトピック、次のようにこのレコードがある:
ノードの最も左及び最も右のノードの
第1の層11の
第二層23
第三層46
第四の層710
第5層1112
第6層13 16
2から左端のノードの次のプリントに上のすべての層。その印刷のためのトピックの例:1,2,4,7,11,13。
3.先行順バイナリツリーは、左端または右端の層に属していないそれらのノードを出力しますが、彼らはまた、リーフノードをノードです。14,15:被験者、すなわち印刷の例。
4.印刷するすべての最も右のノードに下から上に層が、ノードは、最も左ノード、右ノードの両方が、ほとんどであることはできません。その印刷のためのトピックの例:16,12,10,6,3。
////////////標準/////////////////

1  INTのgetHeight(ノードH *、int型 L)// バイナリ層をプレゼント
2  {
 3。 IF(Hは== nullptr A)
 4。 リターンL;
 5  リターン MAX(のgetHeight(H-> L、Lの+ 1)のgetHeight(H - > R&LT、L用+ 1 ));
 6。 }
 7。 ボイド setEdgeMap(ノードH *、int型の L、ベクトル<ベクトル<* >>ノード&edgeMap)
 8。 {
 9。 IF(H == nullptr A)
 10  リターン;
 11。 edgeMap [ L] [ 0 ] = edgeMap [L] [ 0] == nullptr H:edgeMap [L] [ 0 ];
 12である edgeMap [L] [ 1 ] = H;
 13である setEdgeMap(H-> L、Lの+ 1。 ;、edgeMap)// 左側の左側境界を見つける
14 setEdgeMapを(H-> R&LT、L + 1、edgeMap); //は右側の右側境界を見つける
15  }
 16  空隙 printLeafEdge(ノードHの*、int型の L、ベクトル<ベクトル<* >>ノードedgeMapを)
 。17  {
 18は、 IF(H = = nullptr A)
 。19  戻り20は IF!(H-> H- && nullptr L ==> H = R&LT edgeMap && == nullptr A [L] [ 0] && edgeMap H = [L] [!1。 ])// リーフノードではなく、境界ノード約
21である COUT << H-> V << "  " ;
 22は printLeafEdge(H-> L、Lの+ 。1、edgeMap ); // 境界リーフノード見下ろす
23はある printLeafEdge(H-> R&LT、L + 1 ;、edgeMap)
 24  }
 25  空隙 printEdge1(ノード* ルート)
 26である {
 27  IF(ルート== nullptr A)
 28  リターン;
 29  int型 H =のgetHeight(根、0); // 深さを得る
30ベクター<ベクトル<* >> edgeMapノード(H、ベクトル<*ノード>(2)); // 各層の左右の境界
31である setEdgeMap(根、0 、edgeMap);
 32枚の // マージン左プリント
33である ためINT I = 0 ; I <edgeMap.size(); ++ I)
 34が COUT << edgeMap [I] [ 0 ] - > V << "  " ;
 35  // プリントは左右の境界ではなく、境界ノード
36 printLeafEdge(根、0 、edgeMap);
 37 [  // 右境界ノード印刷
38がある ためINT I = edgeMap.size() - 1。; I> = 0 ; - I)
 39  であれば(edgeMap [I] [ 0 ] = edgeMap [I] [!1 ])
 40 COUT << edgeMap [I] [ 1 ] - > V << "  " 41 }

 

次のように標準の2つの要件に応じて具体的な処理の印刷がある:
1.ヘッドノードがあれば、左、最初の子の両方として、ダウン探し始めるだけでなく、右の子ノードを見つけるために、示される時間、次いで、ステップ2に進みます。プロセスでは、我々は、ノードが印刷されて見えました。被験者の例、すなわち、印刷:1、検索プロセスは直接ステップ2に移行した後に後続の印刷が存在しないように、第1のノードが直接、要件を満たすため。しかし、図3に二分木場合-図3は、図示し、今回の印刷:1,2,3。ノード3ノード最初のダウンの要件を満たすためにゼロからスタート。上から下への二分木が見つかった場合、リーフノードは、二分木は、ロッド状構造であることを示す、要件を満たすために存在していない場合、印刷に直接戻るノードを見ました。
返し、最終的と; H右サブツリー印刷プロセスは、ステップ4に進み、最初の印刷処理の2.H左サブツリーは、ステップ3に進みます。
左サブツリーhとすべてのリーフノードの左端を拡張3.印刷経路、printLeftEdge特定の方法を参照してください。
右境界及び右サブツリーH全てのリーフノードを拡張4.印刷パスは、printRightEdge特定の方法を参照してください。
////////////標準2 /////////////////

1  空隙 printLeftEdge(ノード* hで、ブールF)
 2  {
 3  であれば(時間== nullptr)
 4  戻り5  あれば(|| F(H-> L == nullptr && H-> R == nullptr))// 边界叶子节点
6 COUT << H-> V << "  " 7 printLeftEdge(H-> L、F)。
8 printLeftEdge(H-> R、F && H-> L == nullptr?)。
9  }
 10  空隙 printRightEdge(ノード* hで、ブールF)
 11  {
 12 もし(H == nullptr)
 13  リターン14 printLeftEdge(H-> L、F && H-> R == nullptr?)。
15 printLeftEdge(H-> R、F)。
16  であれば(F ||(H-> L == nullptr && H-> R == nullptr))// 边界叶子节点
17 COUT << H-> V << "  " 18  }
 19  空隙 printEdge2(ノード*のルート)
 20  {
 21  であれば(ルート== nullptr)
 22  リターン23 coutの<< root-> V << " ; // ルートを満たす
24を IF(ディレクトリroot-> L = nullptr &&ディレクトリroot-> = R&LT !! Nullptr A)
 25  {
 26である printLeftEdge(ディレクトリroot-> L、真の);
 27 printRightEdge(ディレクトリroot-> R&LT、真の) ;
 28  }
 29  
30 printEdge2(ディレクトリroot-> L = nullptrディレクトリroot-> L:!?ディレクトリroot-> R&LT)、
 31は 
32 }

 

おすすめ

転載: www.cnblogs.com/zzw1024/p/11450437.html