バイナリツリーを考えると、そのノードの値のボトムアップレベル順トラバーサルを返します。(すなわち、左から右への葉から根までのレベルによって、レベル)。
例えば:
与えられた二分木[3,9,20、NULL、NULL、15,7]、
3
/ \
9 20
/ \
15 7
ボトムアップレベル順トラバーサルを返す:
[
[15,7]、
[9,20]、
[3]
]
[
[15,7]、
[9,20]、
[3]
]
効果の件名:
バイナリツリー所与上方リーフノードから、二次元ベクトルによって表され、その出力結果のレベル、左から右に設定された現在階層ノードのベクトルの各要素を横断して保存。
理解:
誰バイナリツリートラバーサル、ベクターは、これらのノードを保存する必要がない場合、なお、第二に、リーフノードから二次元ベクトル内のこれらのノードは、最大保存されたが、上から二分木をトラバースされます。
私のアプローチがある:深さのバイナリツリーの最初のトラバーサルは、層の数、要素即ち番号を取得します。場合トラバーサルは、最後の要素から二次元ベクトル割り当てを開始すると同時に、ルートレベルから開始します。
補助キューとして使用される、それぞれの層は、層が、ベクターとこれらの要素の保存を容易にするときに得られる要素の数をトラバース。そして、現在の空でない子レイヤーは、キューに参加するすべてのノードをノード。
キューが空の場合、すなわち、反復は完了です。
最初のバイナリツリーの深さを得ることなく、することができます。二次元ベクトルに対して設定完全二分木をトラバースした後、直接、各記録層へのアクセスとは、あることができます。
コードC ++:
/ * * *バイナリツリーノードの定義。 *構造体のTreeNode { * INTヴァル。 *のTreeNode *左; *のTreeNode *右; *ツリーノード(int型X):(NULL)左のval(X)、右(NULL){} *}。 * / クラスソリューション{ パブリック: int型 getDepth(TreeNodeの* ルート){ 場合(ルート== NULL)の戻り 0 ; もし(root->左== NULL && root->右== NULL)リターン 1 。 INT左= getDepth(root-> 左)。 int型の右= getDepth(root->右); 返す右>左?左+ 1:右+ 1 ; } ベクトル <ベクトル< INT >> levelOrderBottom(ツリーノード* ルート){ ベクトル <ベクトル< INT >> VEC。 もし(ルート== NULL)戻りVEC; INTの深さ= getDepth(ルート)。 vec.resize(深さ)。 ベクトル < int型 > childVec。 キュー <TreeNodeの*> Q; int型childSize; TreeNode *ノード; q.push(ルート)。 しばらく(!q.empty()= 真){ childSize = q.size(); 一方、(childSize> 0 ){ ノード = q.front()。 childVec.push_back(ノード - > ヴァル) q.pop(); もし(!ノード- >左= NULL) q.push(ノード - > 左)。 もし(!ノード- >右= NULL) q.push(ノード - > 右)。 - childSize; } VEC [深さ - 1 ] = childVec。 childVec.clear(); 深さ - 。 } 戻りVEC。 } }。
結果:
で実行する場合: 16 MSの メモリ消費量: 13.8メガバイトを