Next traversal of Binary Trees
1. Recursive version
/** * 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 once... Why is Ce always used .. I don't want to check it because I think the program is too simple after writing it ..
2. Iterative version
/** * 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; }};
The next traversal requires two pointers to record the status now and pre, and there are three loop boundaries. It seems that this program can be written into many different versions.
The key is how to determine whether the left and right subtree of the now vertex have been accessed.