您的位置:首页 > 其它

利用栈实现的二叉树的先、中、后序遍历

2013-06-06 09:55 555 查看

利用栈实现二叉树的遍历

栈的操作参考:
栈、循环队列的基本操作

先序遍历

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐