//节点结构
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<int> postorderTraversal(TreeNode *root) {
//用于存放后序遍历每个节点的值
vector<int> v;
//用于存放遍历的节点
stack<TreeNode *> s;
TreeNode *cur = 0, *pre = 0;
//根节点入栈
s.push(root);
while((!s.empty()) && (cur = s.top()))
{
//两种情况访问该节点
//1.左右孩子不存在
//2.访问过该节点的左孩子或者右孩子(不加这个条件就会重复访问该节点的左孩子)
if((!cur->left && !cur->right)
||(pre && (pre == cur->left || pre == cur->right)))
{
v.push_back(cur->val);
pre = cur;
s.pop();
}
else
{
//先将右孩子入栈,达到先访问左孩子的目的
if(cur->right)
{
s.push(cur->right);
}
//再将左孩子入栈
if(cur->left)
{
s.push(cur->left);
}
}
}
return v;
}
转载于:https://my.oschina.net/u/1274860/blog/266470