题目:
题解:
/**
* 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:
/*
*本题的解题思路很巧妙,本人不得不佩服啊
1、依次访问右子树,将右子树的各个节点采用头插法存储在数组中
2、当某个节点右子树为空时,该节点出栈,将此节点的左子树压入栈中,倘如左子树为空,访问当前节点的上一节点,如此循环即可
*/
//解法1:迭代版
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if(root==nullptr)return result;
stack<TreeNode*> st;
while(!st.empty()||root!=nullptr)
{
if(root!=nullptr)
{
st.push(root);
result.insert(result.begin(),root->val);
root=root->right;
}
else
{
TreeNode *node=st.top();st.pop();
root=node->left;
}
}
return result;
}
//解法2:递归版
vector<int> postorderTraversal_2(TreeNode* root)
{
if(root==nullptr)return {};
vector<int> result;
helperPostorder(root,result);
return result;
}
void helperPostorder(TreeNode* root,vector<int>& result)
{
if(root==nullptr)return;
helperPostorder(root->left,result);
helperPostorder(root->right,result);
result.push_back(root->val);
}
};