一、递归方法
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
vector<int> left;
vector<int> right;
if (root != NULL) {
left = postorderTraversal(root->left);
right = postorderTraversal(root->right);
res.insert(res.end(), left.begin(), left.end());
res.insert(res.end(), right.begin(), right.end());
res.push_back(root->val);
}
return res;
}
};
二、利用栈(官方做法)
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if (root == NULL) {
return res;
}
stack<TreeNode*> resStack;
resStack.push(root);
while (!resStack.empty()) {
TreeNode* node = resStack.top();
res.insert(res.begin(), node->val);
resStack.pop();
if (node->left != NULL) {
resStack.push(node->left);
}
if (node->right != NULL) {
resStack.push(node->right);
}
}
return res;
}
};
三、利用栈(不破坏栈的结构)
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if (root == NULL) {
return res;
}
stack<TreeNode*> resStack;
set<TreeNode*> visited;
resStack.push(root);
TreeNode* node;
while (!resStack.empty()) {
node = resStack.top();
//若左孩子存在且没有被访问过,压入左孩子
while (node->left != NULL && visited.find(node->left) == visited.end()) {
resStack.push(node->left);
node = node->left;
}
//查看其右孩子,若不存在或者被访问过,访问该节点,否则压右孩子
if (node->right == NULL || visited.find(node->right) != visited.end()) {
res.push_back(node->val);
visited.insert(node);
resStack.pop();
}
else {
resStack.push(node->right);
}
}
return res;
}
};