利用栈实现二叉树的遍历
栈的操作参考:
先序遍历
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;
}
本文介绍如何使用栈来实现二叉树的先序、中序和后序遍历。通过栈的操作,如压栈、弹栈等,实现对二叉树节点的有效访问。在每种遍历方式中,通过特定的逻辑处理来确保正确的访问顺序。
898

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



