题目大意:给出一个二叉树,按照后序遍历该二叉树,返回遍历结果。
算法思想:
1.判断树是否为空,若为空直接返回空向量。
2.设置一个栈,和两个树节点,分别记录当前节点和前驱节点。
3.取栈顶。对于当前节点进行判断,是否满足以下两个条件之一1.该节点不存在孩子节点2.前驱节点为该节点的孩子节点。则说明该节点的孩子节点都访问过了,则可以直接访问节点,并将节点出栈。反之将该节点的左右孩子节点入栈(注意先入右孩子节点。)
4.返回后序遍历结果
代码如下:
/**
* Definition for a binary tree node.
* 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;
if(root==NULL) return res;
stack<TreeNode*> s;
s.push(root);
TreeNode* cur=NULL;
TreeNode* pre=NULL;
while(!s.empty()){
cur=s.top();
if((cur->left==NULL&&cur->right==NULL)||(pre!=NULL&&(pre==cur->left||pre==cur->right))){
res.push_back(cur->val);
s.pop();
pre=cur;
}
else{
if(cur->right!=NULL)
s.push(cur->right);
if(cur->left!=NULL)
s.push(cur->left);
}
}
return res;
}
};