2007-08-23

    二叉树先序中序后序三种遍历的非递归算法 - [Algorithms]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://conoon.blogbus.com/logs/7872508.html

    本贴给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法。
    1.先序遍历非递归算法
    #define maxsize 100
    typedef struct
    {
        Bitree Elem[maxsize];
        int top;
    }SqStack;

    void PreOrderUnrec(Bitree t)
    {
        SqStack s;
        StackInit(s);
        p=t;
       
        while (p!=null || !StackEmpty(s))
        {
            while (p!=null)             //遍历左子树
            {
                visite(p->data);
                push(s,p);
                p=p->lchild;      
            }//endwhile
           
            if (!StackEmpty(s))         //通过下一次循环中的内嵌while实现右子树遍历
            {
                p=pop(s);
                p=p->rchild;       
            }//endif
                   
        }//endwhile
       
    }//PreOrderUnrec

    2.中序遍历非递归算法
    #define maxsize 100
    typedef struct
    {
        Bitree Elem[maxsize];
        int top;
    }SqStack;

    void InOrderUnrec(Bitree t)
    {
        SqStack s;
        StackInit(s);
        p=t;
        while (p!=null || !StackEmpty(s))
        {
            while (p!=null)             //遍历左子树
            {
                push(s,p);
                p=p->lchild;
            }//endwhile
           
            if (!StackEmpty(s))
            {
                p=pop(s);
                visite(p->data);        //访问根结点
                p=p->rchild;            //通过下一次循环实现右子树遍历
            }//endif  
       
        }//endwhile

    }//InOrderUnrec


    3.后序遍历非递归算法
    #define maxsize 100
    typedef enum{L,R} tagtype;
    typedef struct
    {
        Bitree ptr;
        tagtype tag;
    }stacknode;

    typedef struct
    {
        stacknode Elem[maxsize];
        int top;
    }SqStack;

    void PostOrderUnrec(Bitree t)
    {
        SqStack s;
        stacknode x;
        StackInit(s);
        p=t;
       
        do
        {
            while (p!=null)        //遍历左子树
            {
                x.ptr = p;
                x.tag = L;         //标记为左子树
                push(s,x);
                p=p->lchild;
            }   
            while (!StackEmpty(s) && s.Elem[s.top].tag==R) 
            {
                x = pop(s);
                p = x.ptr;
                visite(p->data);   //tag为R,表示右子树访问完毕,故访问根结点      
            }       
            if (!StackEmpty(s))
            {
                s.Elem[s.top].tag =R;     //遍历右子树
                p=s.Elem[s.top].ptr->rchild;       
            }   
        }while (!StackEmpty(s));
    }//PostOrderUnrec


    收藏到:Del.icio.us




    Tag:
    引用地址:

发表评论

您将收到博主的回复邮件
记住我