这题可以理解为二叉树的DFS的退出过程,在退出的过程中将每一个结点放入结果中,同样的可以有两种解法。
第一种递归,AC代码如下:
class Solution {
public:
void postorder(TreeNode* node, vector<int> &ans) {
if(node == nullptr) {
return;
}
postorder(node->left, ans);
postorder(node->right, ans);
ans.push_back(node->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
postorder(root, ans);
return ans;
}
};
第二种栈迭代,这里需要对是否走到底部做特殊判断,满足到底后才将结点的val放入结果中,AC代码如下:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> ans;
if(root == nullptr) {
return ans;
}
stack<TreeNode*> stk;
TreeNode* cur = root;
TreeNode* tmp = nullptr;
while(!stk.empty() || cur!=nullptr) {
while(cur!=nullptr) {
stk.push(cur);
cur = cur->left;
}
cur = stk.top();
stk.pop();
if (cur->right == nullptr || cur->right == tmp) {
ans.push_back(cur->val);
tmp = cur;
cur = nullptr;
} else {
stk.push(cur);
cur = cur->right;
}
}
return ans;
}
};