当前位置:首页>维修大全>综合>

树的遍历算法

树的遍历算法

更新时间:2025-12-10 23:05:02

树的遍历算法

中序遍历

中序遍历比较重要,规则为:左子树,根节点,右子树。

一切都是从根节点开始的。

从A开始,因为A有B左子树,所以A不是第一个点。

B子树没有左子树,所以B为根节点,结果为B。我们知道其实一切都是从根节点开始,在这里是A。

在这种排序遍历中,和一个队列有关。

先将A进入队列,队列中为:A;

然后A出队列,输出A,左右子树的B,E进入队列,队列中为:BE。

然后B出队列,输出AB,C进入队列,队列中为:EC。

然后E出队列,输出为ABE,F进入队列,队列中为:CF。

然后c出队列,输入为ABEC,D进入队列,队列中为:FD。

然后F出队列,输入为ABECF,G进入队列,队列为:DG.

然后D出队列,然后输入为ABECFD,队列为:G

然后G出队列,然后输入为ABECFDG,队列为:HK

然后HK分别出队列,输出为ABECFDGHK。

这里有二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法。

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

更多栏目