//后续遍历
void PostOrder(BiTree T) {
InitStack(S);
p = T;
r = NULL;
while (p || !IsEmpty(S)) {
if (p) {
push(S, p); //走到最左边
p = p->lchild;
}else{
GetTop(S, p); //取栈顶节点
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; //节点访问完后,重置指针P
}
}
}
}