二叉树的层序遍历
书上给出三种基本的遍历算法和概念,而对二叉树的层序遍历算法和概念只字不提!我上网搜索,也没有查到层序的概念,希望高手能给一个详细解释和一个层序算法!
谢谢~
[解决办法]
是按层遍历吧??
[解决办法]
你说的“层序算法”应该和存储结构有关吧
不是二叉树的通用算法吧
[解决办法]
二叉树的层序遍历:用队列实现。代码如下:(本代码并非本人原创,本代码参考自《算法: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;}
[解决办法]
不懂,顶个
[解决办法]
一本书里不可能涵盖所有&……楼主还在学数据结构的吧,里边有的地方讲的是挺简略的
[解决办法]
用队列能比较好的实现,自己试下,在队列里每次压入节点的地址。
[解决办法]