后序遍历的顺序为左 -> 右 -> 根
根据观察,后序遍历倒过来的顺序为根 -> 右 -> 左
而我们已经知道如何进行先序遍历根 -> 左 -> 右
在递归算法中比较好些,只需要调整遍历顺序。但是在迭代算法中,我们首先需要先模拟先序遍历的过程,同时将先序遍历中左右子树遍历过程对换,最后还需将遍历数组翻转才可以得到后序遍历。
递归算法
/**
* 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> res;
vector<int> postorderTraversal(TreeNode* root) {
dfs(root);
return res;
}
void dfs(TreeNode* p)
{
if (!p) return;
dfs(p -> left);
dfs(p -> right);
res.push_back(p -> val);
}
};
迭代算法
/**
* 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;
stack<TreeNode*> st;
auto p = root;
while (p || !st.empty())
{
while (p)
{
res.push_back(p -> val);
st.push(p);
p = p -> right;
}
p = st.top();
st.pop();
p = p -> left;
}
reverse(res.begin(), res.end());
return res;
}
};
这个翻转太妙了