//stack
vector<int> postorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> ret;
TreeNode q=nullptr, p=root;
while(p || !s.empty()){
if(p){
s.push(p);
p=p->left;
}else{
p=s.top();
if(p->right&&p->right!=q){ //右子未访问 所以不但当前P不弹出 而且将P右子塞入(左子已经访问完?)然后从右子的左子树继续(设为新P)
p=p->right;
s.push(p);
p=p->left;
}else{
ret.push_back(p->val);
q=p;
s.pop();
p=nullptr;
}
}
}
return ret;
}
//morris 没过!!!!!
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
TreeNode dummy(-1);
TreeNode p, temp;
vector<int> result;
stringstream out;
p=&dummy;
p->left=root;
while(p){
temp=p->left;
if(!temp){
p=p->right;
}else{
while(temp->right && temp->right!=p)
temp=temp->right;
if(!temp){
temp->right=p;
p=p->left;
}else{
reversePrint(p->left,temp,result);
if(result.size()>0 )
break;
temp->right=nullptr;
p=p->right;
}
}
}
return result;
}
void reverse(TreeNode from, TreeNode to){
if(from==to) return;
TreeNode x=from, y=x->right, *z;
while(x!=to){
z=y->right;
y->right=x;
x=y;
y=z;
}
}
void reversePrint(TreeNode from, TreeNode to, vector<int> &ret ){
reverse(from,to);
TreeNode *p=to;
while(true){
ret.push_back(p->val);
if(p==from)
break;
p=p->right;
}
reverse(to,from);
}
};
Last updated
Was this helpful?