递归
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
visit(T);
//访问根结点也可写成这样
//printf("%c",T->data);
}
}
非递归
void PostOrder(BTNode *b){
BTNode *St[MaxSize];
BTNode *p;
int flag,top=-;
if(b!=NULL){
do
{
while(b!=NULL)
{
top++;
St[top]=b;
b=b->lchild;
//先扫描根结点的所有左孩子结点并一一进栈
//出栈结点记作b,然后扫描该结点的右子树
//当一个结点的左右孩子结点都访问后,再访问该节点
//如此重复操作,直到栈空
}
//执行到此处时,栈顶元素没有左孩子或者左孩子已经被访问过
p=NULL;//p指向栈顶的前一个已经访问过的结点
flag=1;//表示b的左孩子已经访问过或者为空
while(top!=-1&&flag)
{
b=St[top];
if(b->rchild==p)
{
printf("%c",b->data);//访问当前结点b
top--;
p=b;//p指向刚访问过的结点
}
else
{
b=b->rchild;
flag=0;//表示b的左孩子尚未访问
}
}//flag==0 会跳出循环
}while(top!=-1)
}
}