您的位置:首页 > 其它

初始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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: