leiyahui

纸上得来终觉浅,绝知此事要躬行
二叉树遍历的非递归形式

将递归转化为非递归无非是因为一下两个原因:

一是因为有些语言没有递归语法

二是因为递归会有大量的入栈和出栈,所以系统运行比较耗时。

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));
    }
    
}

 

posted on 2015-11-22 17:06  雷大叔  阅读(108)  评论(0)    收藏  举报