递归解法
/**
* 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> res;
vector<int> postorderTraversal(TreeNode* root){
helper(root);
return res;
}
void helper(TreeNode* root){
if(!root)return;
//先递归左子树,再右子树,最后是根节点
if(root->left)helper(root->left);
if(root->right)helper(root->right);
res.push_back(root->val);
}
};
第二种解法,也就是迭代的方法,核心思想:
i、先将当前的左子节点压栈vnode,直到左子节点为NULL时停止;
ii、判断栈顶节点是否有右子节点,如果有,并且没有将右子节点的值压进栈res过,(使用set<TreeNode*> st来判断),那就回到步骤一;否则需要出栈vnode,并且设置该节点的值为已经被压进栈res中过。
solution {
public:
vector<int> res;
vector<int> postorderTraversal(TreeNode* root){
if(!root)return res;
vector<TreeNode*> vnode;
vnode.push_back(root);
TreeNode* idx =root,*pra=NULL,*tmp;
while(idx->left){
vnode.push_back(idx->left);
idx=idx->left;
}
set<TreeNode*> st;
while(!vnode.empty()){
pra = vnode.back();
if(pra->right&&st.find(pra->right)==st.end()){
tmp = pra->right;
vnode.push_back(tmp);
while(tmp->left&&st.find(tmp->left)==st.end()){
vnode.push_back(tmp->left);
tmp = tmp->left;
}
}
else {
vnode.pop_back();
st.insert(pra);
res.push_back(pra->val);
}
}
return res;
}
};