利用栈实现二叉树的遍历
栈的操作参考:
先序遍历
status PreOrderbyStack(BiTree *T, void (*visit)(BiTree *T))
{
stack s;
BiTree *pmove;
initStack(&s);
pmove = T;
Push(&s, T);
while(!IsStackEmpty(&s))
{
Pop(&s, &pmove);
if(pmove == NULL)
{
continue;
}
else
{
visit(pmove);
Push(&s, pmove->rchild);
Push(&s, pmove->lchild);
}
}
destroyStack(&s);
return TRUE;
}
中序遍历
status InOrderbyStack(BiTree *T, void (*visit)(BiTree *T))
{
stack s;
BiTree *pmove;
BiTree *flag;
initStack(&s);
pmove = T;
Push(&s, T);
Push(&s, (BiTree *)1);//加入标号,表示这个节点左孩子还未访问
while(!IsStackEmpty(&s))
{
Pop(&s, &flag);
Pop(&s, &pmove);
if((int)flag == 1)
{
while(pmove->lchild != NULL)
{
Push(&s, pmove);
Push(&s, (BiTree *)0);//加入标号,表示这个节点左孩子已被访问
pmove = pmove->lchild;
}
}
visit(pmove);
if(pmove->rchild != NULL)
{
Push(&s, pmove->rchild);
Push(&s, (BiTree *)1);//加入标号,表示这个节点左孩子还未访问
}
}
destroyStack(&s);
return TRUE;
}
后序遍历
status PostOrderbyStack(BiTree *T, void (*visit)(BiTree *T))
{
stack s;
BiTree *pmove;
BiTree *flag;
initStack(&s);
pmove = T;
Push(&s, T);
Push(&s, (BiTree *)0);//加入标号,表示这个节点左孩子还未访问
while(!IsStackEmpty(&s))
{
Pop(&s, &flag);
Pop(&s, &pmove);
if((int)flag == 0)
{
while(pmove->lchild != NULL)
{
Push(&s, pmove);
Push(&s, (BiTree *)1);//加入标号,表示这个节点左孩子已被访问
pmove = pmove->lchild;
}
}
if((int)flag < 2)
{
if(pmove->rchild != NULL)
{
Push(&s, pmove);
Push(&s, (BiTree *)2);//加入标号,表示这个节点右孩子已被访问
pmove = pmove->rchild;
Push(&s, pmove);
Push(&s, (BiTree *)0);//加入标号,表示这个节点左孩子还未访问
continue;
}
}
visit(pmove);
}
destroyStack(&s);
return TRUE;
}