1つの // 後に達成順トラバーサル非再帰的な 2 // コア:ノードが必要なときに元の位置に戻しポップ1回、2回にポップアップする必要があります(左サブツリートラバーサルが完了している)、二回目は、それがポップアップしたとき出力値(右側のサブツリートラバーサルが完了した) 。3 。4 。5の#include <入出力ストリーム> 。6の#include <スタック> 7。 使用した 名前空間STD; 8 。9 構造体ノード{ 10 のint データ; 11 構造体 * =左ノードnullptr; 12である 構造体ノード右= * nullptr; 13がなく INT時間= 0 ; // カウント値が2に達したとき、もはやスタックを入力; 14 }; 15 16のtypedef構造体のノードノードと、 17 18 ボイドのinit(ノード&ヘッド){ 19 head.data = 1 。 20 21 head.left = 新しいノード()。 22 head.left->データ= 2 。 23 24 head.left->左= 新しいノード()。 25 head.left->左>データ= 3 。 26 27 head.left->左>左= 新しいノード()。 28 head.left->左>左>データ= 4 。 29 30 head.left->右=新しいノード()。 31 head.left->右>データ= 5 。 32 33 head.left->右>左= 新しいノード()。 34 head.left->右>左>データ= 6 。 35 36 head.right = 新しいノード()。 37 head.right->データ= 7 。 38 } 39 40 INT メイン(){ 41 ノードヘッド。 42 43 INIT(ヘッド) 44 45 スタック<ノード*> S。 46 47 ノード* p =&ヘッド; 48 49 ながら(!P = nullptr A || s.empty()){ 50 // スタック 51は、 IF(!P = nullptr A){ 52であり ; s.push(P) 53は、 P = P-> 左。 54 } 55 56である // スタック 57は IF(P == nullptr A){ 58 P = s.top(); 59 s.pop(); 60 61れる P->タイムズ++ ; 62は、 63である // 右サブツリートラバース 64を IF(P->倍==1 ){ 65 s.push(P); 66 P = P-> 右; 67 } 68 69 // p.times == 2;ポップを続行 70を 他{ 71は COUTのP - <<> データ; 72 P = nullptr;バックの//キーステップ 73である } 74 } 75 } 76 77 リターン 0 ; 78 }
キーポイント:
- ノードが空でない、左アクセスノードである場合。
- スタックのうち、この要素は、彼らの訪問を検討する必要がある場合:数が1の場合、あなたは再びそれをプッシュし、右部分木をトラバースする必要があります。数が2の場合、サブツリーのアクセスが完了すると、ノードによって表されるように、ヌルに設定されています。