102バイナリツリー階層トラバーサル
クラスのソリューション{ パブリック: ベクトル<ベクトル<int型>> LEVELORDER(TreeNodeの*ルート){ ベクトル<ベクトル<int型>> RES。 (ルート== nullptr)であれば 、リターンのres; キュー<TreeNodeの*> QUE。 que.push(ルート)。 一方、{(que.empty()!) INT N = que.size()。//记录当前层元素的个数 ベクトル<整数>レベル; {ため(iは++; iがn <I = 0 INT) )(ツリーノード* TMP = que.frontと、 que.pop(); level.push_back(tmp-> val)で、 もし(tmp->左) que.push(tmp->左)。 IF(tmp->右) QUE。 } res.push_back(レベル)。 } RESを返します。 } }。
107二分木階層トラバーサルII
バイナリツリーを考えると、ノードは、ボトムアップ型の値の階層トラバーサルを返します。(すなわち、ルートノードのリーフノードから層への物理層によって、層トラバーサルによって層は左から右へ)
方法:キューの使用、各トラバース次々に、補間結果を用いて走査ヘッダ。逆の順序を達成するために、二次元配列の先頭に挿入されます。
クラスのソリューション{ パブリック: ベクトル<ベクトル<int型>> levelOrderBottom(TreeNodeの*ルート){ ベクトル<ベクトル<int型>> RES。 (ルート== nullptr)であれば 、リターンのres; キュー<TreeNodeの*> QUE。 que.push(ルート)。 一方、{(que.empty()!) INT N = que.size()。 ベクトル<整数>レベル; {ため(iは++; iがn <I = 0 INT) )(ツリーノード* TMP = que.frontと、 que.pop(); level.push_back(tmp-> val)で、 もし(tmp->左) que.push(tmp->左)。 (tmp->右)であれば QUE。 } res.insert(res.begin()、レベル)。 } RESを返します。 } }。
16msの実行
(再帰逆によって実装)再帰的方法を用いる方法II
{ソリューションクラスの パブリック: ベクトル<ベクトル<int型>> levelOrderBottom(TreeNodeの*ルート){ ベクトル<ベクトル<int型>> RES; IF(ルート== nullptr a)に 戻りRESを、 キュー<*のTreeNode> QUE; que.push(ルート); levelOrderBottom(QUE、RES); 戻りRES; } ボイドlevelOrderBottom(キュー<*ツリーノード> QUE、ベクトル<ベクトル<INT >>&RES){ IF(que.empty()) 戻り、 ベクトル<整数> ARR。 キュー<ツリーノード*> queNext; //ストレージノード層用 {//現在の層に記憶されたARRながら、及びqueNextに格納されたノードの下位層(que.empty()!)。再帰的に、最終的に配列arrの解像度に押し込み * tmpは= QUEのTreeNode。 )(que.pop。 arr.push_back(tmp-> val)で、 もし(tmp->左) queNext.push(tmp->左)。 もし(tmp->右) queNext.push(tmp->右)。 } levelOrderBottom(queNext、RES)。 res.push_back(ARR)。 返します。 } }。
レベルトラバース103バイナリツリー千鳥(ジグザグトラバーサル)
方法A:2つのスタック
2つのそれぞれのスタックデータ記憶層は、高度な機能に加えて、ノードの順序についての詳細は、(特定のコード誰でも見ることができる)スタックは、Z字状のジグザグアクセス配列に正確に対応しています。
右往左时右先入栈,左往右时,左先入栈。
クラスのソリューション{ パブリック: ベクトル<ベクトル<int型>> zigzagLevelOrder(のTreeNode *ルート){ ベクトル<ベクトル<int型>> RES。 (ルート== nullptr)であれば 、リターンのres; スタック<TreeNodeの*> STA1、STA2。 ベクトル<整数>編曲。 ツリーノード* TMP =ルート。 sta1.push(TMP)。 一方、(TRUE){ ながら(!sta1.empty()){ TMP = sta1.top()。 sta1.pop(); arr.push_back(tmp-> val)で、 もし(tmp->左) sta2.push(tmp->左)。 もし(tmp->右) sta2.push(tmp->右)。 (もし!arr.empty()){ res.push_back(ARR)。 arr.clear(); //一定要清零 } 他に ブレーク。 (!sta2.empty()){一方 TMP = sta2.top()。 sta2.pop(); arr.push_back(tmp-> val)で、 もし(tmp->右) sta1.push(tmp->右)。 もし(tmp->左) sta1.push(tmp->左)。 } IF(!arr.empty()){ res.push_back(ARR)。 arr.clear(); //一定要清零 } 他 ブレーク; } RESを返します。 } }。