#include"BITREE.h"
//遍历二叉树的非递归算法实现
void PreOrder(BiTree T)//先序遍历二叉树
{
BiTree p=T;
SqStack S;
InitStack(&S);//初始化栈,构造一个空栈S
while (p || !StackEmpty(S))
{
if (p)
{ printf("%3c",p->data);
Push(&S,p);//根指针进栈
p=p->lchild ;//遍历左子树
}
else //根指针退栈,遍历右子树
{ Pop(&S,&p);
p=p->rchild;
}
}
}
void InOrder(BiTree T)//中序遍历二叉树
{
BiTree p=T;
SqStack S;
InitStack(&S);
while (p || !StackEmpty(S))
{
if (p)
{ Push(&S,p);//根指针进栈
p=p->lchild ;//遍历左子树
}
else //根指针退栈,访问根节点,遍历右子树
{ Pop(&S,&p);
printf("%3c",p->data);
p=p->rchild;
}//else
}//While
}//InOrder
void PostOrder(BiTree T)
{//遍历二叉树的非递归算法
BiTree p=T;
SqStack S;
InitStack(&S);
Push(&S,NULL); //初始栈顶放一空指针
while (p || !StackEmpty(S))
{
while (p)
{ p->tag = L;
Push(&S,p); //进入左子树,赋左标志,入栈
p=p->lchild ;
} //左子树已经走到尽头
Pop(&S,&p); //从栈顶弹出一个节点
while (p && (p->tag==R)) //从右子树回来
{ printf("%3c",p->data);
Pop(&S,&p);
}
if (p) //从左子树回来
{
p->tag = R;
Push(&S,p);
p=p->rchild;
}
}
}
评论0