读书人

二叉树的层序遍历,该怎么解决

发布时间: 2012-09-28 00:03:35 作者: rapoo

二叉树的层序遍历
书上给出三种基本的遍历算法和概念,而对二叉树的层序遍历算法和概念只字不提!我上网搜索,也没有查到层序的概念,希望高手能给一个详细解释和一个层序算法!
谢谢~

[解决办法]
是按层遍历吧??
[解决办法]
你说的“层序算法”应该和存储结构有关吧
不是二叉树的通用算法吧
[解决办法]
二叉树的层序遍历:用队列实现。代码如下:(本代码并非本人原创,本代码参考自《算法:C语言实现(第1~4部分)》)也可以到下面这个网站上去看看。
http://210.34.136.253:8488/dyc/DS_Study/DShome.htm
该网站讲的非常详细,有完整的代码实现,希望对你能有所帮助。

C/C++ code
#include <stdio.h>#include <stdlib.h>#define LEN sizeof(struct student)typedef struct student *stud;struct student{    int score;    stud left;    stud right;};static stud* q;static int N,head,tail;void QUEUEinit(int maxN){    q=(stud *)malloc((maxN+1)*sizeof(LEN));    N=maxN+1;    head=N;    tail=0;}stud create() //先序遍历创建二插树{    stud p;    int score;    printf("请输入成绩,0结束:");    scanf("%d",&score);    if(score==0)    {        p=NULL;    }    else{        p=(stud)malloc(LEN);        p->score=score;        printf("左结点:\n");        p->left=create();        printf("右结点:\n");        p->right=create();    }    return p;}int QUEUEempty(){    return head%N==tail;}void QUEUEput(stud p){    q[tail++]=p;    tail=tail%N;}stud QUEUEget(){    head=head%N;    return q[head++];}void traverse(stud p,void(*visit)(stud)){    QUEUEinit(20);    QUEUEput(p);    while(!QUEUEempty()){        (*visit)(p=QUEUEget());        if(p->left!=NULL)            QUEUEput(p->left);        if(p->right!=NULL)            QUEUEput(p->right);    }}void print(stud p){    printf("%d\t",p->score);}int main(){    stud p=create();    traverse(p,print);    return 0;}
[解决办法]
难道你说的是 广度优先?
[解决办法]
不是广度优先。
对于前序遍历,是用栈实现的。代码如下:
C/C++ code
#include <stdlib.h>#include <stdio.h>#define LEN sizeof(struct student)typedef struct student *stud;struct student{    int score;    stud left;    stud right;};stud create(){    stud p;    int score;    printf("请输入成绩,0结束:");    scanf("%d",&score);    if(score==0)    {        p=NULL;    }    else{        p=(stud)malloc(LEN);        p->score=score;        //p->left=p->right=NULL;        printf("左结点:\n");        p->left=create();        printf("右结点:\n");        p->right=create();    }    return p;}static stud *s;static int N;void STACKinit(int maxN){    s=(stud *)malloc(maxN*sizeof(LEN));    N=0;}int STACKempty(){    return N==0;}void STACKpush(stud p){    s[N++]=p;}stud STACKpop(){    return s[--N];}void traverse(stud p,void (*visit)(stud)){    STACKinit(20);    STACKpush(p);    while(!STACKempty()){        (*visit)(p=STACKpop());        if(p->right!=NULL)            STACKpush(p->right);        if(p->left!=NULL)            STACKpush(p->left);    }}void print(stud p){    printf("%d\t",p->score);}int main(){    stud p=create();    traverse(p,print);    return 0;}
[解决办法]
不懂,顶个
[解决办法]
一本书里不可能涵盖所有&……楼主还在学数据结构的吧,里边有的地方讲的是挺简略的
[解决办法]
用队列能比较好的实现,自己试下,在队列里每次压入节点的地址。
[解决办法]

读书人网 >C语言

热点推荐