タイトル
バイナリツリーヘッドヘッドのノードが与えられると、次の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 }