プリアンブル非再帰的トラバーサル(スタック構造を借ります)
①ルートスタックに。
②文のスタック空間、トップ素子出力へのアクセス。
③バック実行②に、右サブツリーが空であるかどうかを判断し、左の部分木が空であるかどうかを決定します。
ボイドプレオーダー(BinTreeのBT) { スタック <BinTree> astack。 BinTreeNode * P; astack.push(BT)。 一方、(!astack.empty()) { P = astack.top()。 astack.pop(); coutの << p型>データ<< " " ; もし(!P-> rightchild = NULL) { astack.push(P - > rightchild)。 } であれば(P-> leftchild!= NULL) { astack.push(P - > leftchild)。 } } }
非再帰的トラバーサル(スタック構造を借りて)ために:
まずルート・スタック
①まず、現在のノードにすべての左側のツリーノードを保存します。
②ツリーが空のままの場合、先頭の要素(一番左の部分木)出力ヴァルを得ます。
③右サブツリートップ要素へのアクセス(P = P->右)、①に戻って落ちます。
無効順序どおり(BinTree BT) { スタック <BinTree> aStack; BinTree P; P = BT; IF(P == NULL) { リターン; } astack.push(BT); P = P-> leftchild; 一方(P || !astack.empty()) { 一方(P = NULL)!// NULLまでの深さの左のブランチに沿って { astack.push(P); P = P-> leftchild; } P = astack.top(); // 一つ一つをポップアップし、訪問 astack.pop(); COUT << P->データ<< " " ; P = P-> rightchild; // 右のブランチに、次の円、左深さの右ブランチ上 } }
後順トラバーサル非再帰的(スタック構造を借ります):
①現在のノードが空でないかどうかを判断し、スタックが空でない場合、すべてのノードプッシュのルートノードの、左サブツリー。
②)(先頭の要素とポップを取得し、それは要素(すなわち「/」タイプのうち、最後のポップであるかどうか、左の部分木の何を最上位の要素を決定するために、この時間は、まだ右部分木トラバーサルの現在のトップの要素を表し、ので、再びスタックの現在のトップのルートノードの右サブツリー)、①を続け、満たされていない、それがNULLです。
ボイド後順(BinTree BT) { BinTree P = BT、 スタック <BinTree> aStack; IF(BT == NULL) { リターン; } ながら(!= NULL || Pのastack.empty()) { ながら!(P = NULL) { astack.push(P-); P- = P-> P-leftchild> leftchild :? P-> rightchild; // 左の子が空でない場合、子供が左に移動したり、右の子に移動 } // ここで私たちは、一番下に到達した P = )(astack.topを、 astack.pop(); COUT << p型> <<データ" " ; IF - (astack.empty()&&(astack.top()> P leftchild - ==)!)// スタックが空ではない、とだけアクセスノードは子のままにすると 、{ P- = astack.topを() - > rightchild; // 右の子にシフトし、次の大きなサイクルは、このノードの下を探し始め } 他// 子供は子供が最後のプロセスに残ったことを示し、右のであれば 、{ P- ; = NULL // P-Fuが空であります、最初のサイクルの次のサイクルが返さ一つに対応する、大通過したように } } }