您的位置:首页 > 理论基础 > 数据结构算法

第六章:数据结构基础。第二部分

2013-10-24 21:57 603 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: