void PreOrder(BiTree T) //先序非递归遍历二叉树
{
InitStack(S); //创建工作栈
Push(S,T);
while(!StackEmpty(S))
{
Pop(S,p); //出栈
Visit(p); //访问
if(p->rchild)
Push(S,p->rchild); //右子树入栈
if(p->lchild)
Push(S,p->lchild); //左子树入栈
}
}
void InOrder(BiTree T) //中序非递归遍历二叉树
{
InitStack(S); //创建工作栈
Push(S,<T,0>); //根入栈,且置标志此时不能访问
while(!StackEmpty(S))
{
Pop(S,<p,flag>); //出栈
if(flag==1)
Visit(p); //访问标志为可以访问
else
{
if(p->rchild)
Push(S,<p->rchild,0>); //右子树入栈且置访问标志
Push(S,<p,1>); //根入栈且置访问标志
if(p->lchild)
Push(S,<p->lchild,0>); //左子树入栈且置访问标志
}
}
}
void PostOrder(BiTree T) //后序非递归遍历二叉树
{
InitStack(S); //创建工作栈
Push(S,<T,0>); //根入栈,且置i0标志此时不能访问
while(!StackEmpty(S))
{
Pop(S,<p,flag>); //出栈
if(flag==1)
Visit(p); //访问标志为可以访问
else
{
Push(S,<p,1>); //根入栈且置访问标志
if(p->rchild)
Push(S,<p->rchild,0>); //右子树入栈且置访问标志
if(p->lchild)
Push(S,<p->lchild,0>); //左子树入栈且置访问标志
}
}
}