题目描述:

判断两序列是否为同一二叉搜索树序列
输入:                       
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出:                       

如果序列相同则输出YES,否则输出NO

样例输入:                       
  1. 2
  2. 567432
  3. 543267
  4. 576342
  5. 0
样例输出:                       
  1. YES
  2. NO
    在九度ojPending了两天,今天终于能用了,终于一次就AC了,代码如下:
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <string>
  5.  
  6. /*
  7. 0
  8. 1 2
  9. 3 4 5 6
  10. 7 8 9 10 11 12 13 14
  11.  
  12. */
  13. void buildTree(int n,int num[],int tree[],int left[],int right[]) {
  14. for(int i = ; i < ; i++) {
  15. tree[i] = -;
  16. left[i] = -;
  17. right[i] = -;
  18. }
  19. int top = num[];
  20. tree[top] = ;
  21. for(int i = ; i < n; i++) {
  22. top = num[];
  23. int address = ;
  24. while(true) {
  25. if(num[i] < top) {
  26. address = * address + ;
  27. if(left[top] == -) {
  28. left[top] = num[i];
  29. tree[num[i]] = address;
  30. break;
  31. }
  32. else {
  33. top = left[top];
  34. }
  35. }
  36. else if(num[i] > top) {
  37. address = * address + ;
  38. if(right[top] == -) {
  39. right[top] = num[i];
  40. tree[num[i]] = address;
  41. break;
  42. }
  43. else {
  44. top = right[top];
  45. }
  46. }
  47. }//while
  48.  
  49. }
  50. }
  51.  
  52. char s[];
  53. int main(int argc, char const *argv[])
  54. {
  55. int n;
  56. int len;
  57. scanf("%d",&n);
  58. while(n != ) {
  59. int num[];//source
  60. int tree[];//every num's address
  61. int left[];//every num's nextLeft's value
  62. int right[];//every num's nextRight's value
  63. scanf("%s",s);
  64. for(int i = ; i < strlen(s); i++) {
  65. num[i] = s[i] - '';
  66. }
  67. buildTree(strlen(s),num,tree,left,right);
  68. len = strlen(s);
  69. for(int i = ; i < n; i++) {
  70. scanf("%s",s);
  71. int numt[];//source
  72. int treet[];//every num's address
  73. int leftt[];//every num's nextLeft's value
  74. int rightt[];//every num's nextRight's value
  75. for(int i = ; i < strlen(s); i++) {
  76. numt[i] = s[i] - '';
  77. }
  78. buildTree(strlen(s),numt,treet,leftt,rightt);
  79. bool flag = true;
  80. if(strlen(s) != len) {
  81. flag = false;
  82. }
  83. for(int i = ; i < strlen(s) && flag == true; i++) {
  84. if(treet[numt[i]] != tree[numt[i]]) {
  85. flag = false;
  86. break;
  87. }
  88. }
  89. if(flag == false) {
  90. printf("%s\n","NO");
  91. }
  92. else {
  93. printf("%s\n","YES");
  94. }
  95. }
  96. scanf("%d",&n);
  97. }
  98. return ;
  99. }

这道题的思路是用数组记录建好树后每一个数字的位置,通过比较位置信息来判断是不是同一棵树

九度oj题目1009:二叉搜索树的更多相关文章

  1. 九度oj 题目1009:二叉搜索树

    题目1009:二叉搜索树 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5733 解决:2538 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n&l ...

  2. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  3. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  4. 九度oj题目&amp;吉大考研11年机试题全解

    九度oj题目(吉大考研11年机试题全解) 吉大考研机试2011年题目: 题目一(jobdu1105:字符串的反码).    http://ac.jobdu.com/problem.php?pid=11 ...

  5. 九度oj 题目1007:奥运排序问题

    九度oj 题目1007:奥运排序问题   恢复 题目描述: 按要求,给国家进行排名. 输入:                        有多组数据. 第一行给出国家数N,要求排名的国家数M,国家号 ...

  6. 九度oj 题目1367:二叉搜索树的后序遍历序列

    题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 输入: 每个测试案例包括2行: 第一行为1个整数 ...

  7. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  8. 九度OJ题目1105:字符串的反码

    tips:scanf,cin输入字符串遇到空格就停止,所以想输入一行字符并保留最后的"\0"还是用gets()函数比较好,九度OJ真操蛋,true?没有这个关键字,还是用1吧,还是 ...

  9. 九度oj题目1002:Grading

    //不是说C语言就是C++的子集么,为毛printf在九度OJ上不能通过编译,abs还不支持参数为整型的abs()重载 //C++比较正确的做法是#include<cmath.h>,cou ...

随机推荐

  1. How many '1's are there题解

    Description: Description: 第一行输入数字n(n<=50),表示有n组测试用例,第2到第n+1行每行输入数m(m为整数),统计并输出m用二进制表示时,1的个数. 例如:m ...

  2. [习题]输入自己的生日(年/月/日)#2 -- 日历(Calendar)控件的时光跳跃,一次跳回五年、十年前?--TodaysDate属性、VisibleDate属性

    原文出處  http://www.dotblogs.com.tw/mis2000lab/archive/2013/06/10/calendar_visibledate_birthday_dropdow ...

  3. 使用JDK自带的jmap和jhat监控处于运行状态的Java进程

    对于处于运行状态中的Java进程,JDK自带了很多工具,允许Java开发人员监控运行进程中的各种状态,比如该进程内部创建了多少个对象实例,消耗了多少内存,等等. 本文基于JDK1.8而写成. 我下面写 ...

  4. (转)MyBatis框架的学习(七)——MyBatis逆向工程自动生成代码

    http://blog.csdn.net/yerenyuan_pku/article/details/71909325 什么是逆向工程 MyBatis的一个主要的特点就是需要程序员自己编写sql,那么 ...

  5. Maven添加本地依赖

    在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围)       compile 是默认的范围:如果没有提供一个范围,那该依赖的范围就是编译范围.编译范围依赖在所有的c ...

  6. MVC使用方法

    1.mvc打开html代码 后台处理:   ///<summary>         ///恢复html中的特殊字符         ///</summary>         ...

  7. 什么是Java内存模型中的happens-before

    Java内存模型JMM Java内存模型(即Java Memory Model , 简称JMM),本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序个各个变量(包括实 ...

  8. Codeforces Round #510 #A

    http://codeforces.com/contest/1042/problem/A 题目大意就是: 现在公园里有n个长椅(要多长有多长),第i个长椅上有a[i]个人(泰山崩于前而不乱),现在又有 ...

  9. [LUOGU] P2716 和谐的雪花

    https://www.luogu.org/problemnew/show/P2716 给出一个n*m的矩形,求里面边长最小的正方形,使得该正方形内最大值与最小值的差大于等于给定的K. 第一反应是二分 ...

  10. Spring中使用注解 @Scheduled 执行定时任务

    来自:http://blog.51cto.com/dwf07223/1557145 注解@Scheduled 可以作为一个触发源添加到一个方法中,例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行 ...