题目描述:
给定一个二叉树,返回它的 后序 遍历。
代码实现:
方法一:(递归)
class Solution {
public:
void postorder(TreeNode* root,vector &ans)
{
if(root==NULL)
return ;
postorder(root->left,ans);
postorder(root->right,ans);
ans.push_back(root->val);
}
vector postorderTraversal(TreeNode* root) {
vector ans;
postorder(root,ans);
return ans;
}
};
方法二:(迭代)–>利用栈空间
思想:
1、如果栈顶元素非空且左节点存在, 将其压入栈中,如果栈顶元素存在左节点,将其左节点压栈,重复该过程。直到左结点不存在则进入第2步
2、判断上一次出栈节点是否是当前栈顶结点的右节点(就是右叶子结点,如:g,f结点),或者当前栈顶结点不存在右结点(如:g,f,a结点),将当前节点输出,并出栈。否则将当前栈顶结点右孩子节点压栈,再进入第1步
class Solution {
public:
vector postorderTraversal(TreeNode* root) {
vector<int> ans;
if(root==NULL)
return ans;
stack<TreeNode*> S;
S.push(root);
TreeNode* lastpop=NULL;
while(!S.empty())
{
while(S.top()->left!=NULL)
{
S.push(S.top()->left);
}
while(!S.empty())
{
if(lastpop==S.top()->right||S.top()->right==NULL)
{
ans.push_back(S.top()->val);
lastpop=S.top();
S.pop();
}
else if(S.top()->right!=NULL)
{
S.push(S.top()->right);
break;
}
}
}
return ans;
}
};