樹的非遞歸遍歷——前序、中序、後序
阿新 • • 發佈:2018-09-12
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 };
樹的非遞歸遍歷——前序、中序、後序