1. 程式人生 > >樹的非遞歸遍歷——前序、中序、後序

樹的非遞歸遍歷——前序、中序、後序

reorder 後序遍歷 color root targe left tor 調整 continue

樹的遞歸遍歷非常簡單,也是寫樹的遍歷時最常用的寫法。但是我發現自己對樹的非遞歸遍歷並不十分熟悉,所以把三種非遞歸遍歷都寫了一遍,以後看到這篇記錄博客也可以幫助自己好好回想熟悉一下。

Leetcode對應習題:前序,中序,後序。

相對而言,這三種非遞歸遍歷的難度——前序 < 中序 < 後序。

對於第三種(非遞歸後序遍歷)方法,只要稍微調整下第18~19行三個節點push的順序,就可以實現前中後序的遍歷。

樹的非遞歸前序:

 1 class Solution {
 2 public:
 3     vector<int> preorderTraversal(TreeNode* root) {
4 vector<int> re; 5 stack<TreeNode*> s; 6 s.push(root); 7 while(!s.empty()){ 8 TreeNode *temp = s.top(); 9 s.pop(); 10 if(!temp) continue; 11 re.push_back(temp->val); 12 s.push(temp->right);
13 s.push(temp->left); 14 } 15 return re; 16 } 17 };

樹的非遞歸中序:

 1 class Solution {
 2 public:
 3     vector<int> inorderTraversal(TreeNode* root) {
 4         stack<TreeNode*> s;
 5         vector<int> re;
 6         TreeNode *t = root;
 7         while
(!s.empty() || t){ 8 while(t){ 9 s.push(t); 10 t = t -> left; 11 } 12 if(!s.empty()){ 13 TreeNode *temp = s.top(); 14 s.pop(); 15 re.push_back(temp->val); 16 t = temp->right; 17 } 18 } 19 return re; 20 } 21 };

樹的非遞歸後序遍歷:

 1 class Solution {
 2 public:
 3     vector<int> postorderTraversal(TreeNode* root) {
 4         stack<pair<TreeNode*, bool> > s;
 5         vector<int> re;
 6         s.push(make_pair(root, false));
 7         bool visited;
 8         while(!s.empty()){
 9             pair<TreeNode*, bool> p = s.top();
10             s.pop();
11             visited = p.second;
12             if(!p.first){
13                 continue;
14             }
15             if(visited){
16                 re.push_back(p.first->val);
17             }else{
18                 s.push(make_pair(p.first, true));
19                 s.push(make_pair(p.first->right, false));
20                 s.push(make_pair(p.first->left, false));
21             }
22         }
23         return re;
24     }
25 };

樹的非遞歸遍歷——前序、中序、後序