方法一:递归
/**
* 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 {
private:
vector<int> vc;
public:
vector<int> postorderTraversal(TreeNode* root) {
if(root){
postorderTraversal(root->left);
postorderTraversal(root->right);
vc.push_back(root->val);
}
return vc;
}
};
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
postTravel(root, res); //传递res参数保存返回值
return res;
}
private:
void postTravel(TreeNode* root,vector<int> &vc){
if(!root)
return;
postTravel(root->left,vc);
postTravel(root->right,vc);
vc.push_back(root->val);
}
};
方法二:迭代 ,逆序
类似前序遍历,根->右->左
逆序输出
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
while(root || !st.empty()){
while(root){
st.push(root);
res.push_back(root->val);
root = root->right;
}
root = st.top();
st.pop();
root = root->left;
}
return vector<int> (res.rbegin(),res.rend()); //逆序输出
}
};
方法三:栈,迭代
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> st;
map<TreeNode*,bool> mp; //判断从左右子树返回,从右子树返回设为true
while(root || !st.empty()){
while(root){ //移动到左下角,这样左子树就访问完了
st.push(root);
root = root->left;
}
while(!st.empty() && mp[st.top()]){ //从右子树返回,访问根节点
res.push_back(st.top()->val);
st.pop();
}
if(!st.empty()){ //从左子树访返回,访问右子树
root=st.top()->right;
mp[st.top()]=true;
}
}
return res;
}
};