问题描述:
Given a binary tree, return the postordertraversal of its nodes' values.
Example:
Input:[1,null,2,3]
1 \ 2 / 3 Output:[3,2,1]
Follow up: Recursive solution is trivial, could you do it iteratively?
源码:
果然后序就比先序麻烦了很多。要考虑不少因素,什么时候加左子树,什么时候加右子树,什么时候输出。
/**
* 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:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if(!root) return result;
stack<TreeNode*> st;
st.push(root);
TreeNode* pre = NULL;
while(!st.empty()){
TreeNode *tmp = st.top();
if((!tmp->left && !tmp->right) || (!tmp->right && tmp->left==pre) || (tmp->right && tmp->right==pre)){
result.push_back(tmp->val);
pre = tmp;
st.pop();
continue;
}
while(tmp->left && tmp->left != pre){
tmp = tmp->left;
st.push(tmp);
}
if(tmp->right && (tmp->left==pre || !tmp->left)){
st.push(tmp->right);
}
}
return result;
}
};
网上大佬的做法:
/**
* 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:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if(!root) return result;
stack<TreeNode*> st;
while(root){
st.push(root);
root = root->left;
}
TreeNode* pre = NULL;
while(!st.empty()){
TreeNode *tmp = st.top();
st.pop();
if(!tmp->right || tmp->right == pre){
result.push_back(tmp->val);
pre = tmp;
}
else{
st.push(tmp);
tmp = tmp->right;
while(tmp){
st.push(tmp);
tmp = tmp->left;
}
}
}
return result;
}
};
教科书上的写法:参考非递归遍历二叉树的方法。第一次的时候访问为true,第二次时为false,此时需要输出了。p才是主要的,栈只是辅助。
/**
* 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:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if(!root) return result;
stack<pair<TreeNode*, bool>> st;
TreeNode* p = root;
while(!st.empty() || p){
while(p){
st.push(make_pair(p, true));
p = p->left;
}
if(!st.empty()){
TreeNode* tmp = st.top().first;
bool visit = st.top().second;
st.pop();
if(visit){
st.push(make_pair(tmp, false));
p = tmp->right;
}
else{
result.push_back(tmp->val);
p = NULL;
}
}
}
return result;
}
};
简书中的大佬还做了一个简化,效率都是100%。很牛逼:
/**
* 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:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if(!root) return result;
stack<pair<TreeNode*, bool>> st;
st.push(make_pair(root, false));
while(!st.empty()){
TreeNode* tmp = st.top().first;
bool visit = st.top().second;
st.pop();
if(!tmp) continue;
if(visit){
result.push_back(tmp->val);
}
else{
st.push(make_pair(tmp, true));
st.push(make_pair(tmp->right, false));
st.push(make_pair(tmp->left, false));
}
}
return result;
}
};