初始BFS ,以及二叉树层次遍历
2014-08-08 10:19
211 查看
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;
}
输入一颗二叉树,你的任务是按从上到下、从左到右的顺序输出各个节点的值。每个节点都按照从根节点到他的移动序列给出(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;
}
相关文章推荐
- 二叉树建立 以及 bfs层次遍历
- 查找二叉树的基本操作以及层次遍历
- 二叉树创建、前序遍历、中序遍历、后序遍历 的 递归与非递归实现 以及 层次遍历
- 二叉树的深度优先,广度优先,以及层次遍历算法
- 【二叉树】层次遍历二叉树以及判断一棵树是否是完全二叉树
- 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
- 二叉树的深度、叶子数以及先、中、后、层次遍历
- 二叉树的非递归遍历以及层次遍历(前序、中序、后序)
- 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作
- 二叉树的创建,以及递归前中后序以及层次遍历
- 二叉树的层次遍历(BFS),二叉树的所有路径,二叉树的最大路径和(分治)
- 数据结构_求二叉树的高度以及层次遍历二叉树算法_C语言源代码
- 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法
- 白书练习 层次遍历 (二叉树的bfs)
- 二叉树的先序、中序、后序的递归及非递归实现,以及层次遍历的实现:
- 面试常考手写代码之--二叉树层次遍历(BFS)
- 二叉树的先序、中序、后序以及层次遍历
- 6-3-2 二叉树层次遍历(BFS)
- uva 122 Trees on the level 二叉树的层次遍历(bfs)
- 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作