Problem description:
输入一颗二叉树,你的任务是按从上到下、从左到右的顺序输出各个节点的值。每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左括号和有括号之间没有空格,相邻节点之间有一个空格。每棵树的输入用括号()结束。
样例输入:
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()
样例输出:
5 4 8 11 13 4 7 2 1
---------------------------------------------------------------------------
二叉树的层次遍历是,借助队列实现的,
首先,找到根节点,判断左孩子是否为空,不为空,则将左节点添加到队列中;
再判断,右孩子是否为空,不为空,则将右节点添加到队列中;
下一次循环,让指针指向队列中的下一个元素;
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
typedef struct node
{
int num;
struct node *left ,*right;
}Node;
Node *root;//建立头指针
Node *newnode()//建立新的结点
{
Node *u = (Node*)malloc(sizeof(Node));
if(u!=NULL)
{
//u->flag = false;
u->left = u->right = NULL;
}
return u;
}
void addnode(int num,char *s)//添加元素
{
int n ,i;
n = strlen(s);
Node *u = root;
for(i=0;i<n;i++)
{
if(s[i]=='L')
{
if(u->left==NULL)
u->left = newnode();
u = u->left;
}
else if(s[i]=='R')
{
if(u->right==NULL)
u->right = newnode();
u = u->right ;
}
}
u->num = num;
}
void remove(Node *u)
{
if(u==NULL)
return ;
remove(u->left);
remove(u->right);
free(u);
}
void read()
{
int num;
char s[1000];
memset(s,0,sizeof(s));
root = newnode();//程序头部建立Node类型的指针,这里为它分配节点
while(scanf("%s",s)!=EOF)
{
if(strcmp(s,"()")==0)
break;
sscanf(&s[1],"%d",&num);//从s[1]中以十进制的格式将字符数字变成数字
addnode(num,strchr(s,',')+1);
}
return ;
}
void bfs()
{
int n=0,i;
//int ans[1000];
int front = 0,rear = 1;
Node *q[1000];
q[0] = root; //q数组就是模拟的队列,它能够存储按层次(也是宽度优先遍历)遍历到二叉树的节点
while(front<rear)
{
Node *u = q[front++];
printf("%d ",u->num);
if(u->left!=NULL)
q[rear++] = u->left;
if(u->right!=NULL)
q[rear++] = u->right;
}
//for(i=1;i<rear;i++)
// printf("%d ",q[i]->num);
printf("\n");
}
int main()
{
read();
bfs();
remove(root);
while(1);
return 0;
}