/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
void traversal(TreeNode* cur, vector<int>& vec){
if(cur == NULL) return;
traversal(cur->left, vec);
traversal(cur->right, vec);
vec.push_back(cur->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
traversal(root, result);
return result;
}
};
以上为递归
以下迭代:
1.
先序遍历是中左右,后序遍历是左右中,那么我们只需要调整一下先序遍历的代码顺序,就变成中右左的遍历顺序,然后在反转result数组,输出的结果顺序就是左右中了,如下图:
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
if(root == NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
result.push_back(node->val);
if(node->left != NULL) st.push(node->left);
if(node->right != NULL) st.push(node->right);
}
reverse(result.begin(), result.end());
return result;
}
};
对于根节点来说:
-
第 1 次经过它,去向左子树。
-
第 2 次从左子树回来,经过它,去向右子树。
-
第 3 次从右子树回退到它。
步骤:
-
初始化一个空栈。
-
当【根节点不为空】或者【栈不为空】时,从根节点开始
-
每次将当前节点压入栈中,如果当前节点右左子树,就往左子树跑,没有左子树就往右子树跑。
-
若当前节点无左子树也无右子树,从栈中弹出该节点,如果当前节点是上一个节点(即弹出该节点后的栈顶元素)的左节点,尝试访问上个节点的右子树,如果不是,那当前栈的栈顶元素继续弹出。
-
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
vector<int> result;
TreeNode* cur = root;
if(cur == NULL) return result;
while(cur || !st.empty()){
while(cur){
st.push(cur);
if(cur->left) cur = cur->left;
else cur = cur->right;
}
cur = st.top();
st.pop();
result.push_back(cur->val);
if(!st.empty() && st.top()->left == cur){
cur = st.top()->right;
}
else cur = NULL;
}
return result;
}
};