//方法一: 一个栈 + 一个工作指针 + 一个指针标记最近访问过的结点
void postOrder(BiTree T)
{
if(!T) return;
InitStack(S);
BtNode p=T,r=NULL;
while( p || !isEmpty(S)){
if(p){
push(S,p);
p=p->lchild;
}
else{
if(p->rchild&&p->rchild!=r){
p=p->rchild;
push(S,p);
p=p->lchild;
}
else{
pop(S,p);
visit(p->data);
r = p;
p=NULL;
}
}
}
}
//方法二:两个栈
void postOrder(BiTree T){
if(!T) return;
InitStack(S1);
InitStack(S2);
BTNode p=T;
push(S1,p);
while(!isEmpty(S1)){
pop(S1,p);
push(S2,p);
if(p->lchild) push(S1,p->lchild);
if(p->rchild) push(S1,p->rchild);
}
while(!isEmpty(S2)){
push(S2,p);
visit(p->data);
}
}