您的位置:首页 > 其它

二叉树先序、中序、后序三种遍历的…

2013-08-08 13:25 190 查看
本贴给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法。

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://www.cnblogs.com/baoyu/archive/2005/08/29/225486.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐