HDU 3791 二叉搜索树(用数组保存树)
2016-07-26 09:27
357 查看
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2
567432
543267
576342
0
Sample Output
YES
NO
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2
567432
543267
576342
0
Sample Output
YES
NO
一.总结
用结构来写二叉树真的好麻烦,老是各种错误,用数组就来的简单的多,如果数据范围允许的话,用数组来保存二叉树是很理想的#include <iostream> #include <cstring> #include <cstdio> using namespace std; const int maxn=1024; int tree1[maxn]; int tree2[maxn]; string a,b; int find(int n,int p,int *tree) { if(tree[p]==-1) return p; else if(n>tree[p]) return find(n,2*p+1,tree); else return find(n,2*p,tree); } void init1() { memset(tree1,-1,sizeof(tree1)); for(int i=0;i<a.length();i++) { int p=find(a[i]-48,1,tree1); tree1[p]=a[i]-48; } } void init2() { memset(tree2,-1,sizeof(tree2)); for(int i=0;i<b.length();i++) { int p=find(b[i]-48,1,tree2); tree2[p]=b[i]-48; } } int main() { //freopen("/Users/zhangjiatao/Documents/暑期训练/input.txt","r",stdin); int n; while(scanf("%d",&n)==1) { if(n==0) break; cin>>a; init1(); for(int i=1;i<=n;i++) { cin>>b; int flag=1; init2(); for(int i=1;i<maxn;i++) { if(tree1[i]!=tree2[i]) {flag=0;break;} } if(flag==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } return 0; }
相关文章推荐
- SVN-查看两版本区别
- 执行GP工具
- STM32之CAN ---CAN ID过滤器分析
- 计算机右键-管理打不开解决办法
- 如何在生产环境中运行Docker容器
- Cpp环境【POJ3045】【Vijos2982】Cow Acrobats 牛的杂技套路
- 光线跟踪引擎做到了
- Android App应用启动分析与优化
- 【HDU 1159】Common Subsequence(最长公共序列LCS算法)
- au3
- Signalr如何在服务器端主动发送消息到客户端
- Volley 启动流程
- 关于C++ string和c类型字符数组的对比
- tomcat服务器和jboss服务器重启命令
- 搜索自己博客中的文章
- canvas1
- 十分钟玩转 jQuery、实例大全
- hdu 2828 Lamp 重复覆盖
- iOS开发拓展篇—应用之间的跳转和数据传递
- 获取当前运行脚本所在路径