Given a binary tree, return the postorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [3,2,1]
.
Note: Recursive solution is trivial, could you do it iteratively?
Solution1 : Simulate the recursive program:
Note that: 1. sta.pop();
2.
if (!sta.empty()) {
not
while (!sta.empty()) {
The right code is :
/**
* 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) {
stack<pair<TreeNode*, int>> sta;
vector<int> res;
while (root != NULL || !sta.empty()) {
while (root != NULL) {
sta.push(make_pair(root, 0)); //0 stands for right child and itself;
root = root->left;
}
if (!sta.empty()) {
root = sta.top().first;
int status = sta.top().second;
sta.pop();
if (status == 0) {
sta.push(make_pair(root, 1));
root = root->right;
}
else if (status == 1){
res.push_back(root->val);
root = NULL;
}
}
}
return res;
}
};
Solution 2: Using two stacks:
/**
* 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) {
stack<TreeNode*> s,output;
vector<int> res;
TreeNode* cur = NULL;
if (root != NULL)
s.push(root);
while (!s.empty()) {
cur = s.top();
s.pop();
output.push(cur);
if (cur->left)
s.push(cur->left);
if (cur->right)
s.push(cur->right);
}
while (!output.empty()) {
res.push_back(output.top()->val);
output.pop();
}
return res;
}
};
Solution 3: Record the previous node, when cur->left == prev, push the right child to stack for the next-turn visiting:
A wrong code:
/**
* 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> res;
TreeNode *prev = NULL, *cur = NULL;
stack<TreeNode*> s;
if (root != NULL)
s.push(root);
while (!s.empty()) {
cur = s.top();
if (prev == NULL || prev->left == cur || prev->right == cur)
if (cur->left)
s.push(cur->left);
else if (cur->right)
s.push(cur->right);
else if (cur->left == prev && cur->right)
s.push(cur->right);
else {
res.push_back(cur->val);
s.pop();
}
prev = cur;
}
return res;
}
};
The right code is :
/**
* 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> res;
TreeNode *prev = NULL, *cur = NULL;
stack<TreeNode*> s;
if (root != NULL)
s.push(root);
while (!s.empty()) {
cur = s.top();
if (prev == NULL || prev->left == cur || prev->right == cur) {
if (cur->left)
s.push(cur->left);
else if (cur->right)
s.push(cur->right);
}
else if (cur->left == prev && cur->right)
s.push(cur->right);
else {
res.push_back(cur->val);
s.pop();
}
prev = cur;
}
return res;
}
};