解決すべき問題:
私を悩ませてきた、人々は次の見たい1. Aの問題は、入力ツリーを処理する方法です、それはこの階層をトラバースするのが最善です明確かつ直感的な方法です。
ポインタの使用に関しては2 *
そのため、コードへのリードが完了していない、何の主な機能はありませんソリューションのクラスを呼び出します
各ノードIIで117移入次の右ポインタ
中
バイナリツリーを考えます
構造体ノード{ int型のval; ノード*左; ノード*右; 次のノード*; }
その右隣のノードを指し示すように、それぞれ次のポインタを取り込みます。何のすぐ隣のノードが存在しない場合は、次のポインタがに設定する必要があります NULL
。
最初は、すべての次のポインタがに設定されています NULL
。
ファローアップ:
- あなただけの一定の余分なスペースを使用することができます。
- 再帰的なアプローチは、あなたがこの問題のための余分なスペースとしてカウントされません暗黙のスタック領域をとることができる、罰金です。
例1:
INPUT:ルート= [1,2,3,4,5、ヌル,. 7] 出力:[1、#、2,3、#、4,5,7、#] 説明:指定したバイナリツリー(図A上)、あなたの関数は、それぞれ次移入すべきである 。図B.ザ出力をシリアル化だけのように、その右隣のノードを指すようにポインタを次のポインタによって接続されたように「#」は、各レベルの終わりを意味して、レベルのオーダーである。
この問題は差の問題に変形:
ツリーの特定のノードが存在するか否かを区別することなく、完全二分木では、ツリーは、再帰と非再帰二種類を横断しなければなりません。再帰的な方法は異なりますが、非再帰的な方法を
適用することもできます。非再帰的な方法が良いことである、と組み合わせたスタック、それ自体がもたらす木の影響を無視し、スタックに要素が存在します。この方法は、スペース内にあり、
二重の循環があるが、複雑さに非常によく行われますが、サイクル数が少ない理由であると推定されて実行さ
#include <ビット/ STDC ++ H> / * 複数行コメント * / 使用して 名前空間STDを、 // ノードの定義。 クラスノード{ パブリック: int型のval; ノード * 左; ノード * 右; ノード * 次の; // 三つの異なる種類の初期化 のval(:ノード()0 )、左(NULL)、右(NULL)、次の(NULL){} ノード(INT _val):ヴァル(_val)、左(NULL)を、右(NULL )、次の(NULL){} ノード(int型 _val、ノード* _left、ノード* _right、ノード*_next) :ヴァル(_val)、左(_left)、右(_right)、次の(_next){} }。 // 解の定義 クラスのソリューション{ パブリック: ノード *接続(ノード* ルート){ // 特殊な場合の契約 の場合(ルート!)戻りNULL; //はラインでキューストアのリストを定義 キュー<ノード*> Q; q.push(ルート)。 //はまだノード反復処理していない 間(!q.empty()) { int型のlen = q.size(); 以下のための(int型 I =0 ; I <lenの; ++ I) { ノード * T = q.front()。 q.pop(); もし(I <len- 1)T->次= q.front()。 もし q.push(T->(T->左)左)。 もし(T->右)q.push(T-> 右)。 } } 戻りルート。 } }。