题意:

给出一些字符串,由(,)包着,表示一个节点,逗号前面是节点的值,后面是节点从根节点走向自己位置的路线,输入以( )结尾,如果这组数据可以构成一个完整的树,输出层次遍历结果,否则输出not complete,即不是一个完整的树 或者有的点被覆盖了多次。

思路:

按照路径字符串的长短从小到大排序,然后建立二叉树,最后进行层次遍历,看能遍历到多少个点,如果遍历到的点与输入的点的个数相同,则输出层次遍历顺序。

注意:

要多组输入,栽了两次了

有一组数据 (,) () 程序运行答案是0 ,但我认为从题面意思理解是not complete ,这个点没有被赋值,所以不是完整的树,或者说是空树。

看代码:

#include<algorithm>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct qq
{
int val=-1;
char dis[301];
} q[10110];
bool cmp(qq a,qq b)
{
if(strlen(a.dis)!=strlen(b.dis))
return strlen(a.dis)<strlen(b.dis);
}
struct node
{
int val;
node *lch,*rch;
};
node *insert(node *p,char *p1,int x)
{
if(p1[0]=='\0')
{
node *q=new node;
q->val=x;
q->lch=q->rch=NULL;
return q;
}
if(p==NULL)
return p;
if(p1[0]=='R')
{
p->rch=insert(p->rch,p1+1,x);
return p;
}
else if(p1[0]=='L')
{
p->lch=insert(p->lch,p1+1,x);
return p;
}
}
struct QQ
{
int f,val,h;
} Q[10101];
bool cmp1(QQ a,QQ b)
{
if(a.f!=b.f)
return a.f<b.f;
return a.h<b.h;
}
int r=0;
typedef struct node *tree;
int ans[1010],kk;
void find(node *p)//层序遍历函数
{
queue<tree>q;
if(p==NULL)
return;
q.push(p);
node *qq;
while(!q.empty())
{
qq=q.front();
q.pop();
ans[kk++]=qq->val;
if(qq->lch!=NULL) q.push(qq->lch);
if(qq->rch!=NULL) q.push(qq->rch); }
}
int main()
{
char s[301];
while(~scanf("%s",s))
{
memset(ans,0,sizeof(ans));
int w=0;
if(s[0]=='('&&s[1]==')')
continue;
int k=0,i,j;
for(i=1; s[i]!=','; i++)
k=k*10+s[i]-'0';
q[w].val=k;
for(i++,j=0; s[i]=='R'||s[i]=='L'; i++,j++)
q[w].dis[j]=s[i];
q[w].dis[j]='\0';
w++;
while(1)
{
scanf("%s",s);
if(s[0]=='('&&s[1]==')')
break;
k=0;
for(i=1; s[i]!=','; i++)
k=k*10+s[i]-'0';
q[w].val=k;
for(i++,j=0; s[i]=='R'||s[i]=='L'; i++,j++)
q[w].dis[j]=s[i];
q[w].dis[j]='\0';
w++;
}
sort(q,q+w,cmp);
node *p=NULL;
for(int i=0; i<w; i++)
p=insert(p,q[i].dis,q[i].val);
r=0;
kk=0;
find(p);
if(kk==w)
{
for(int i=0; i<kk-1; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[kk-1]);
}
else
printf("not complete\n");
}
return 0;
}

HDU - 1622 用到了层次遍历的更多相关文章

  1. hdu 1622 Trees on the level(二叉树的层次遍历)

    题目链接:https://vjudge.net/contest/209862#problem/B 题目大意: Trees on the level Time Limit: 2000/1000 MS ( ...

  2. HDU 1622

    http://acm.hdu.edu.cn/showproblem.php?pid=1622 白书上6.3.2二叉树层次遍历的例题,层次遍历用bfs,建立二叉树,很基础的题目 #include < ...

  3. lintcode二叉树的锯齿形层次遍历 (双端队列)

    题目链接: http://www.lintcode.com/zh-cn/problem/binary-tree-zigzag-level-order-traversal/ 二叉树的锯齿形层次遍历 给出 ...

  4. <二叉树的基本操作(有层次遍历)>

    #include<stdio.h> #include<stdlib.h> #include<string.h> #define num 100 #define OK ...

  5. uva 11234 Expressions 表达式 建树+BFS层次遍历

    题目给出一个后缀表达式,让你求从下往上的层次遍历. 思路:结构体建树,然后用数组进行BFS进行层次遍历,最后把数组倒着输出就行了. uva过了,poj老是超时,郁闷. 代码: #include < ...

  6. 【二叉树遍历模版】前序遍历&&中序遍历&&后序遍历&&层次遍历&&Root->Right->Left遍历

    [二叉树遍历模版]前序遍历     1.递归实现 test.cpp: 12345678910111213141516171819202122232425262728293031323334353637 ...

  7. lintcode: 二叉树的锯齿形层次遍历

    题目 二叉树的锯齿形层次遍历 给出一棵二叉树,返回其节点值的锯齿形层次遍历(先从左往右,下一层再从右往左,层与层之间交替进行) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, 3 / \ ...

  8. lintcode : 二叉树的层次遍历II

    题目 二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, ...

  9. lintcode : 二叉树的层次遍历

    题目 二叉树的层次遍历 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 7 返回他的分层遍历 ...

随机推荐

  1. Python在计算内存时应该注意的问题?

    我之前的一篇文章,带大家揭晓了 Python 在给内置对象分配内存时的 5 个奇怪而有趣的小秘密.文中使用了sys.getsizeof()来计算内存,但是用这个方法计算时,可能会出现意料不到的问题. ...

  2. Python神经网络编程笔记

    神经元 想一想便知道,当一个人捏你一下以至于你会痛得叫起来的力度便是神经元的阈值,而我们构建的时候也是把这种现象抽象成一个函数,叫作激活函数. 而这里便是我们使用sigmoid函数的原因,它是一个很简 ...

  3. vue项目基本步骤

    首先查看电脑是否已经安装vue并查看版本: window+R快捷打开命令行,cmd,输入node -v回车 如果未安装操作步骤如下: 1:$ cnpm install vue(新电脑安装Vue,永久) ...

  4. Webpack和Gulp,Webpack和Gulp的基本区别:

    Gulp和Webpack的基本区别: gulp可以进行js,html,css,img的压缩打包,是自动化构建工具,可以将多个js文件或是css压缩成一个文件,并且可以压缩为一行,以此来减少文件体积,加 ...

  5. vue iview modal弹出框 form表单验证

    一.ref="addApply" :model="addApply" :rules="ruleValidate"   不要忘记prop 二. ...

  6. 复制url事故:出现特殊的字符%E2%80%8B

    复制url事故:出现特殊的字符%E2%80%8B 问题:直接其他地方复制过来的中文字进行网页搜索.或者中文字识别排序等情况的,会出现搜索不到的情况. 解决方法:可能存在复制源里面的文字带了空白url编 ...

  7. Cisco asa组建IPSEC for ikev1

    IPSec的实现主要由两个阶段来完成:--第一阶段,双方协商安全连接,建立一个已通过身份鉴别和安全保护的通道.--第二阶段,安全协议用于保护数据的和信息的交换. IPSec有两个安全协议:AH和ESP ...

  8. 面试总被问分布式ID怎么办? 滴滴(Tinyid)甩给他

    整理了一些Java方面的架构.面试资料(微服务.集群.分布式.中间件等),有需要的小伙伴可以关注公众号[程序员内点事],无套路自行领取 一口气说出 9种 分布式ID生成方式,面试官有点懵了 面试总被问 ...

  9. 关于“关键字synchronized不能被继承”的一点理解

    网上看到很多对关键字synchronized继承性的描述只有一句"关键字synchronized不能被继承",并没有描述具体场景,于是自己做了以下测试. //父类 public c ...

  10. Notepad++远程连接Linux

    为方便编辑Linux上的文件,我们可以用Notepad++的NppFTP插件 工具:Notepad++.CentOS 1.通过ifconfig命令找到主机ip 2.打开Notepad++插件NppFT ...