1.递归
/**
* 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> postorderTraversal(TreeNode* root) {
vector<int> res;
PostorderTraversal(root,res);
return res;
}
void PostorderTraversal(TreeNode* root,vector<int>& res) //用引用记录结果相当于在类里加了一个res的成员来记录,这个引用会从递归的最开始处开始记录数据
{
if(root==nullptr)
return;
if(root->left)
PostorderTraversal(root->left,res);
if(root->right)
PostorderTraversal(root->right,res);
res.push_back(root->val);
}
};
2.利用栈
先入根节点
弹栈,保存到结果中,入左孩子,入右孩子,依次循环
将结果反序
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
if(root==nullptr)
return res;
stack<TreeNode*> s;
s.push(root);
while(!s.empty())
{
TreeNode* tmp = s.top();
s.pop();
res.push_back(tmp->val); //根节点加入vector
if(tmp->left) //左孩子入栈
s.push(tmp->left);
if(tmp->right) //右孩子入栈
s.push(tmp->right);
}
reverse(res.begin(),res.end()); //结果反序
return res;
}
};
参考
https://blog.csdn.net/qq_17550379/article/details/81044345(还没看,看了后决定是否删除)
3.利用栈,并且保存已经访问过的节点(还没看懂,这个应该才是真正的后序遍历)
参考:
https://leetcode.com/problems/binary-tree-postorder-traversal/discuss/45550/C%2B%2B-Iterative-Recursive-and-Morris-Traversal
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> nodes;
stack<TreeNode*> todo;
TreeNode* last = NULL;
while (root || !todo.empty()) {
if (root) {
todo.push(root);
root = root -> left;
} else {
TreeNode* node = todo.top();
if (node -> right && last != node -> right) {
root = node -> right;
} else {
nodes.push_back(node -> val);
last = node;
todo.pop();
}
}
}
return nodes;
}
};