二叉树建立 以及 bfs层次遍历

Problem description:

     输入一颗二叉树,你的任务是按从上到下、从左到右的顺序输出各个节点的值。每个节点都按照从根节点到他的移动序列给出(L表示左,R表示右)。在输入中,每个节点的左括号和有括号之间没有空格,相邻节点之间有一个空格。每棵树的输入用括号()结束。

    注意:如果从根到某个叶节点的路径上有的节点没有在输入中给出或者给出了超过一次,应当输出-1。借点数不超过256。

 

样例输入:

         (11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) ()

     (3,L) (4,R) ()

样例输出:

       5 4 8 11 13 4 7 2 1

      -1     

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
using namespace std;
int failed=0;
typedef struct Tnode              //typedef  声明
{
    int have_value;                     //是否被赋值过
    int v;                                    //节点值
    struct Tnode *left,*right;
}Node;
Node *root;                              //根节点
Node *newnode()                    //建立新节点
{
    Node *u=(Node *)malloc(sizeof(Node));
    if(u!=NULL)
    {
        u->have_value=0;
        u->left=u->right=NULL;
    }
    return u;
}
void addnode(int v,char *s)    //添加节点建树
{
    int n=strlen(s);
    Node *u=root;
    for(int 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;
    }
    if(u->have_value) failed=1;
    u->v=v;
    u->have_value=1;
}

char s[1000];
int read_input()                //读入信息
{
    failed=0;
    root=newnode();
    while(scanf("%s",s)!=EOF)
    {
        if(strcmp(s,"()")==0) break;
        int v;
        sscanf(&s[1],"%d",&v);
        addnode(v,strchr(s,',')+1);
    }
    return 1;
}
int n=0,ans[1000];             //节点总数和输出序列
int bfs()
{
    int front=0,rear=1;
    Node *q[1000];
    q[0]=root;                  //初始的一个节点
    while(front<rear)
    {
        Node *u=q[front++];
        if(!u->have_value) return 0;       //有的节点没有呗赋值过,表明输入有误

        ans[n++]=u->v;
        if(u->left!=NULL)  q[rear++]=u->left;
        if(u->right!=NULL) q[rear++]=u->right;

    }
    return 1;
}



int main()
{
    read_input();
    if(failed||!bfs()) printf("-1");
    else
        for(int i=0;i<n;i++)
        printf("%d ",ans[i]);
    printf("\n");
    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值