二叉樹遍歷演算法的非遞迴實現
阿新 • • 發佈:2020-07-11
- 前序遍歷的非遞迴實現
- 中序遍歷的非遞迴實現
1 void InOrder2(BTNode *root) { 2 BTNode *p = root; 3 stack<BTNode *> S; 4 while (p != NULL || !S.empty()) { 5 if (p) { // 找到樹中最左邊的那個結點,並將路徑中經過的結點依次壓入棧中 6 S.push(p); 7 p = p->left; 8 } else{ // 如果該節點為空則輸出其雙親結點 9 S.pop(); 10 p = S.top(); 11 cout << p->val << " "; 12 p = p->right; // 訪問雙親結點的右孩子 13 } 14 } 15 }
- 後序遍歷的非遞迴實現
1 #include <bits/stdc++.h> 2 3 using namespacestd; 4 5 const int maxsize = 1005; 6 7 typedef struct BTNode { 8 int val; 9 BTNode *left; 10 BTNode *right; 11 }; 12 13 typedef struct { 14 BTNode *p; 15 int revisited; 16 } SNode; 17 18 void PostOrder2(BTNode *root) { 19 SNode sn; 20 BTNode *pt = root; 21 stack<SNode> S;22 while (pt) { 23 S.push({pt, 0}); 24 pt = pt->left; 25 } 26 while (!S.empty()) { 27 sn = S.top(); 28 if (sn.p->right == NULL || sn.revisited == 1) { 29 S.pop(); 30 cout << pt->val << " "; 31 } else { 32 sn.revisited = 1; 33 pt = sn.p->right; 34 while (pt != NULL) { 35 S.push({pt, 0}); 36 pt = pt->left; 37 } 38 } 39 } 40 }