初始BFS ,以及二叉树层次遍历

来源:互联网 发布:临沂蓝狐网络网络诈骗 编辑:程序博客网 时间:2024/06/06 03:24

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;
}

 

          

0 0
原创粉丝点击