6.3.2 层次遍历:
问题描述:
按照层次遍历二叉树。
代码:
/* 数据的输入形式为: 数据1:(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) () 数据2:(3,L) (4,R) () */ #include <stdio.h> #include <string.h> #define N 1000 int failed;//输入数据是否合法的标志变量; //定义二叉树的结点类型; typedef struct LNode { int value; int number;//两者分别代表是否被赋过值以及被赋值的大小。 LNode *L,*R; }LNode,*LinkList; LNode *root; //创建 新结点,并赋值为0的函数; LNode *NewNode() { LNode *m = new LNode; if(m!=NULL) { m->value=m->number=0; m->L=m->R=NULL; } return m; } // 向二叉树中插入结点; // 按照路径行走,当路径不存在的时候调用newnode来创建新结点。 void AddNode(int v,char *s) { //v代表结点值;s代表行走路径; int i,j,len=strlen(s); LNode *u=root;//root为根结点; for(i=0;i<len-1;i++) { if(s[i]=='L') { if(u->L==NULL) u->L=NewNode(); u=u->L; } else if(s[i]=='R') { if(u->R==NULL) u->R=NewNode(); u=u->R; } } if(u->value==1) failed=1; //failed代表输入数据是否符合规则,定义为全局变量; u->number=v;u->value=1; } char s[N+10]; int Input() { //创建二叉树; failed=0; root=NewNode(); for(;;) { if(scanf("%s",s)!=1) return 0; if(!strcmp(s,"()")) break; int v; sscanf(&s[1],"%d",&v);//读入结点值,并赋值给v; AddNode(v,strchr(s,',')+1); } return 1; } //宽度优先遍历二叉树;按层次遍历; int n=0,ans[N+10]; int dfs() { int front=0,rear=1; LNode *q[N+10]; q[0]=root; while(front<rear) { //宽度优先遍历,利用队列; LNode *u=q[front++]; if(!u->value) {failed=1;return 0;} ans[n++]=u->number; if(u->L) q[rear++]=u->L; if(u->R) q[rear++]=u->R; } return 1; } int main() { //创建二叉树; Input(); dfs(); //按层次输出结点值; if(failed==1) printf("-1\n"); else { for(int i=0;i<n;i++) printf("%d ",ans[i]); printf("\n"); } return 0; }