void PostOrder(BiTree bt, void (*visit)(TElemType))
/* 使用栈,非递归后序遍历二叉树bt, */
/* 对每个结点的元素域data调用函数visit */
{
Stack s;
InitStack(s);
SElemType selem;
BiTree pb=bt;
while(!StackEmpty(s)||pb){
if(!pb){ //返回根结点,指针为空标明访问完成,需要返回上一层或者右子树
Pop(s,selem);
if(selem.tag==0){ //从左子树返回根结点
selem.tag=1;
Push(s,selem);
pb=selem.ptr->rchild;
}
else{ //从右子树返回根结点
(*visit)(selem.ptr->data);
pb=NULL;
}
}
else if(pb->lchild){ //走到最左,记录路径信息
selem.ptr=pb;
selem.tag=0;
Push(s,selem);
pb=pb->lchild;
}
else if(pb->rchild){ //向右走一步
selem.ptr=pb;
selem.tag=1;
Push(s,selem);
pb=pb->rchild;
}
else{ //访问叶子结点
(*visit)(pb->data);
pb=NULL;
}
}
}
/* 使用栈,非递归后序遍历二叉树bt, */
/* 对每个结点的元素域data调用函数visit */
{
Stack s;
InitStack(s);
SElemType selem;
BiTree pb=bt;
while(!StackEmpty(s)||pb){
if(!pb){ //返回根结点,指针为空标明访问完成,需要返回上一层或者右子树
Pop(s,selem);
if(selem.tag==0){ //从左子树返回根结点
selem.tag=1;
Push(s,selem);
pb=selem.ptr->rchild;
}
else{ //从右子树返回根结点
(*visit)(selem.ptr->data);
pb=NULL;
}
}
else if(pb->lchild){ //走到最左,记录路径信息
selem.ptr=pb;
selem.tag=0;
Push(s,selem);
pb=pb->lchild;
}
else if(pb->rchild){ //向右走一步
selem.ptr=pb;
selem.tag=1;
Push(s,selem);
pb=pb->rchild;
}
else{ //访问叶子结点
(*visit)(pb->data);
pb=NULL;
}
}
}
1165

被折叠的 条评论
为什么被折叠?



