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].
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?
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
typedef struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
}TreeNode;
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
TreeNode *p = NULL, *q = NULL;
vector<int> res;
stack<TreeNode *> st;
p = root;
do
{
//一直向左侧走
while (p != NULL)
{
st.push(p);
p = p->left;
}
q = NULL;
while (!st.empty())
{
p = st.top();
st.pop();
//q记录的不是p的左子树就是p的右子树
//q若是p的右子树,说明p已经是第二次出栈了
if (p->right == q)
{
res.push_back(p->val);
q = p;
}
//q不是p的右子树,说明p的右子树还未访问
//那q就应该再次入栈,开始访问右子树
else
{
st.push(p);
p = p->right;
break;
}
}
} while (!st.empty());
return res;
}
};
//测试用例
int main()
{
TreeNode *pa, *pb, *pc, *pd;
pa = new TreeNode(1);
pb = new TreeNode(2);
pc = new TreeNode(3);
pd = new TreeNode(4);
pa->left = pb;
pa->right = pc;
pb->right = pd;
Solution so;
vector<int> res = so.postorderTraversal(pa);
for each (int var in res)
{
cout << var << " ";
}
}