非再帰を横断した後、

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. スタックのうち、この要素は、彼らの訪問を検討する必要がある場合:数が1の場合、あなたは再びそれをプッシュし、右部分木をトラバースする必要があります。数が2の場合、サブツリーのアクセスが完了すると、ノードによって表されるように、ヌルに設定されています

おすすめ

転載: www.cnblogs.com/yy-1046741080/p/11510811.html