1.二叉树先序遍历非递归
先访问根节点t及其所有右下结点,将访问过的结点进栈保存起来。当前结点没有左子树或左孩子时,转向右子树,对右子树进行上述处理。
void PreOrder(BiTree T)
{
InitStack(S);
p=T;
while(p||!isEmpty(S))
{
if(p)
{
printf(p->data);
push(S,p);
p=p->lchild;
}
else
{
pop(S,p);
p=p->rchild;
}
}
}
2.中序非递归遍历
void InOrder(BiTree T)
{
InitStack(S);
p=T;
while(p||!StackEmpty(S))
{
if(p)
{
push(S,p);
p=p->lchild;
}
else
{
pop(S,p);
printf(p->data);
p=p->rchild;
}
}
}
3.后序非递归
把根节点的左孩子依次入栈,直到左孩子为空
读栈顶元素,若有右孩子且未被访问过,执行上一步的过程
右子树为空或右子树被访问完,栈顶元素出栈并访问
void PostOrder(BiTree T)
{
InitStack(S);
p=T;
while(p||!StackEmpty(S))
{
if(p)
push(S,p);
p=p->lchild;
}
else
{
pop(S,p);
if(p->rchild&&(p->rchild.tag==0)
{
p=p->rchild;
push(S,p);
p=p->lchild;
}
else
{
pop(S,p);
printf(p->data);
p.tag=1;
p=NULL;
}
}
}