您的位置:首页 > 理论基础 > 数据结构算法

数据结构中二叉树的三种遍历的非递归写法

2016-05-08 09:37 567 查看
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

转自:http://baoyu.cnblogs.com/archive/2005/08/29/225486.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息