標籤:blog os for leetcode io res
二叉樹的後續遍曆
1、遞迴版本
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: void dfsPostorderTraversal(TreeNode *now, vector<int> &result) { if (now == NULL) { return; } dfsPostorderTraversal(now->left, result); dfsPostorderTraversal(now->right, result); result.push_back(now->val); } vector<int> postorderTraversal(TreeNode *root) { vector<int> result; dfsPostorderTraversal(root, result); return result; }};
CE一次。。。為什麼我總是CE呢。。因為寫完之後覺得程式太簡單,所以不想檢查。。
2、迭代版本
/** * Definition for binary tree * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: vector<int> postorderTraversal(TreeNode *root) { vector<int> result; TreeNode *now, *pre; stack<TreeNode*> s; now = root; pre = NULL; //while (now != NULL || !s.empty()) { do { while (now != NULL) { s.push(now); now = now->left; } pre = NULL; while (!s.empty()) { now = s.top(); if (now->right != pre) { now = now->right; break; } else { result.push_back(now->val); pre = now; s.pop(); } } } while(!s.empty()); return result; }};
後續遍曆需要兩個指標來選項組now和pre,還有3個迴圈的邊界,感覺這個程式可以寫成很多不同的版本。
關鍵是如何判斷now這個點的左子樹和右子樹都已經被訪問過了。