二叉树遍历的非递归形式
将递归转化为非递归无非是因为一下两个原因:
一是因为有些语言没有递归语法
二是因为递归会有大量的入栈和出栈,所以系统运行比较耗时。
1 前序遍历二叉树的非递归实现
void PreOrder(BTptr T)
{
BTptr p=T;
ClearStack(s);
Push(S,T);
while(!EmptyStack(s))
{
q=Pop(s);
while(p)
{
Visit(p);
if(p->LChild)
{
if(p->RChild)
{
push(s,p->RChild);
}
p=p-LChild;
}
else
{
p=p->RChild;
}
}
}
}
二 中序遍历二叉树时的非递归实现
void InOrder(BTptr T)
{
BTptr p=T;
ClearStack(s);
push(s,p);
while(!EmptyStack(p)))
{
while(p=GetTop()&&p) //直到左节点的最后一个为空为止
{
push(s,p->LChild);
}
Pop(s); //除掉最后一个空节点
if(!Emptystack(s))
{
p=Pop(s);
Visit(p);
push(s,p->RChild); //遍历p的右节点
}
}
}
三 后序遍历方式实现
这个比较难,因为要左边遍历过后并且右边也遍历过之后才能访问,所以说要要更改栈的类型,加上一个标志符,当访问到一个节点的时候,第一次遍历令
tag=0,第二次遍历才令tag=1这样主要是为了明确左边遍历过后,右边也遍历过后才访问。
typedef struct
{
BTptr q;
int ta;
}stype;
void Postorder(BTptr T)
{
int tag;
BTptr p=T;
stype sdata;
if(T!=NULL)
{
ClearStack(s);
do
{
while(p)
{
sdata.tag=0;
sdata.q=p;
push(sdata));
p=p->LChild;
}
sdata=Pop(s);
p=sdata.q;
tag=sdata.tag;
if(tag==0) //第一次遍历
{
sdata.q=p;
sdata.tag=1;
push(S,data);
p=p->RChild;
}
else //第二次遍历
{
visit(p);
p=NULL;
}
}while(p||!EmptyStack(s));
}
}
浙公网安备 33010602011771号