二叉樹的遍歷


 

轉載自編程愛好者論壇,原帖地址http://www.programfan.com/club/showbbs.asp?id=96192

二叉樹的遍歷有3種方式:

         a
        / /
       /   /
      b     e
     / /     /
    /   /     /
   c     d     f

(先序)先根遍歷:(根左右)先訪問根,再訪問左子樹,最后訪問右子樹,則可得如下的序列:abcdef

(中序)中根遍歷:(左根右)先訪問左子樹,再訪問根,最后訪問右子樹,則可得如下的序列:cbdaef

(后序)后根遍歷:(左右根)先訪問左子樹,再訪問右子樹,最后訪問根,則可得如下的序列:cdbfea




本文給出二叉樹先序、中序、后序三種遍歷的非遞歸算法,此三個算法可視為標准算法。

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

 

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷 二叉樹的遍歷
 
粤ICP备14056181号  © 2014-2021 ITdaan.com