这道题与第7章查找有关,当时提前看到,翻到书里面的算法,然后打进去,虽然是正确的,但是那时候并不知道二叉排序树的基础知识,包括插入查找的来龙去脉,现在已经学到了,有了一定了解,发现题目只用到了其中部分性质,主要还是树那一章的知识。

 是否同一棵二叉搜索树

给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。

输入格式:

输入包含若干组测试数据。每组数据的第1行给出两个正整数NN (\le 10≤10)和LL,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出NN个以空格分隔的正整数,作为初始插入序列。最后LL行,每行给出NN个插入的元素,属于LL个需要检查的序列。

简单起见,我们保证每个插入序列都是1到NN的一个排列。当读到NN为0时,标志输入结束,这组数据不要处理。

输出格式:

对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。

输入样例:

  1. 4 2
  2. 3 1 4 2
  3. 3 4 1 2
  4. 3 2 4 1
  5. 2 1
  6. 2 1
  7. 1 2
  8. 0

输出样例:

  1. Yes
  2. No
  3. No
  4. 我的做法很直接,就判断建立的二叉搜索树各结点是否一致
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. typedef struct BSTnode
  5. {
  6. int data;//数据域
  7. struct BSTnode *l,*r;
  8. }BSTnode,*BSTree;
  9.  
  10. void insert(BSTree &T,int e)//二叉搜索树的插入
  11. {
  12. if(!T)//插入第一个数
  13. { BSTnode *S;
  14. S=new BSTnode;
  15. S->data=e;
  16. S->l=S->r=NULL;
  17. T=S;
  18. }
  19. else if(e<T->data)//将待插入的数按二叉搜索树定义进行插入
  20. insert(T->l,e);
  21. else if(e>T->data)
  22. insert(T->r,e);
  23. }
  24.  
  25. void create(BSTree &T,int m)//建立树
  26. {
  27. T=NULL;
  28. int e,i;
  29. for(i=;i<m;i++)
  30. {
  31. cin>>e;
  32. insert(T,e);
  33. }
  34.  
  35. }
  36.  
  37. bool compare(BSTree T,BSTree t)//判断是否为同一棵树
  38. {
  39.  
  40. if(T==NULL && t==NULL)
  41. return true;
  42. else if((T==NULL && t!=NULL)||(T!=NULL && t==NULL))
  43. return false;
  44. else if((T!=NULL && t!=NULL)&&(T->data != t->data))
  45. return false;
  46. return (compare(T->l,t->l)&&compare(T->r,t->r));
  47. }
  48.  
  49. int main()
  50. {
  51. BSTree t,t1;
  52. t=NULL;
  53. int m,n,j;
  54. cin>>m;
  55. while(m)//这里主要是根据题目要求进行比较和输出
  56. { cin>>n;
  57. create(t,m);
  58. for(j=;j<n;j++)
  59. {
  60. create(t1,m);
  61. if(compare(t,t1)) cout<<"Yes\n";
  62. else cout<<"No\n";
  63. }
  64. cin>>m;
  65. }
  66. return ;
  67. }

在比较两棵树的compare函数中,运用了递归,这次我的递归思想算是有了进步,不去考虑下一层的情况了,只要保证本层所有情况都考虑到就行。

7-1 QQ帐户的申请与登陆 (30 分)
 

实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。

输入格式:

输入首先给出一个正整数N(≤),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。

输出格式:

针对每条指令,给出相应的信息:

1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。

输入样例:

  1. 5
  2. L 1234567890 myQQ@qq.com
  3. N 1234567890 myQQ@qq.com
  4. N 1234567890 myQQ@qq.com
  5. L 1234567890 myQQ@qq
  6. L 1234567890 myQQ@qq.com

输出样例:

  1. ERROR: Not Exist
  2. New: OK
  3. ERROR: Exist
  4. ERROR: Wrong PW
  5. Login: OK
  6. 刚开始做这道题目的时候,并没有想到用map映射容器,原因一个是对于map用法不太了解,一个是想尝试用学过的知识解决问题。所以,我第一次用的是简单的结
    构体,代码如下:
  1. #include<iostream>
  2. #include<cstring>
  3. using namespace std;
  4. typedef struct info
  5. {
  6. int account;
  7. string password;
  8. }info;
  9.  
  10. int main()
  11. {
  12. int i,n,num;
  13. char x;
  14. string s;
  15. info I;
  16. I.account=;I.password=" ";
  17. cin>>n;
  18. for(i=;i<n;i++)
  19. {
  20. cin>>x>>num>>s;
  21. if(x=='L')
  22. {
  23. if(I.account==)
  24. cout<<"ERROR: Not Exist\n";
  25. else
  26. {
  27. if(I.account==num&&I.password==s)cout<<"Login: OK\n";
  28. else cout<<"ERROR: Wrong PW\n";
  29. }
  30.  
  31. }
  32. if(x=='N')
  33. {
  34. if(I.account==||I.account!=num)
  35. {
  36. I.account=num;I.password=s; cout<<"New: OK\n";
  37. }
  38. else
  39. cout<<"ERROR: Exist\n";
  40. }
  41. }
  42. }

勉强通过2个测试点,第3个没能过原因是上面的程序只能解决申请账号问题,不能保存申请几个之后对应的账号密码,也就是没有保存功能,测试几组数据情况不正确,后来我尝试修改了一下,用了结构体数组,但是代码变得很复杂;这是我就想,这样不如学习一下map用法,参考了网上一些资料还有STL书籍,简单知道map的存储结构,然后发现只需要简单修改一下之前那个程序就好了。

  1. #include<iostream>
  2. #include<map> //map映射容器,它的元素数据由一个键值和一个映射数据组成一一映照的关系
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. int n,i;
  9. char x;
  10. string y,z;
  11. map<string,int>p; //map对象p作为判断,检查账号是否存在
  12. map<string,string>p1;//map对象p1作为存储申请的账号密码
  13. cin>>n;
  14. for(i=;i<n;i++)
  15. {
  16. cin>>x>>y>>z;
  17. if(x=='L')
  18. {
  19. if(p[y]==) cout<<"ERROR: Not Exist\n";//在创建map对象p时候,内部初始化int的映射数据为0,所以可作为判断条件
  20. else
  21. {
  22. if(p1[y]!=z) cout<<"ERROR: Wrong PW\n";//检查账号密码是否正确
  23. else cout<<"Login: OK\n";
  24. }
  25. }
  26. if(x=='N')
  27. {
  28. if(p[y]==) cout<<"ERROR: Exist\n";//申请的账号已经存在
  29. else
  30. {
  31. p[y]=;//新申请的账号如果未重复,则标记此账号现已申请
  32. p1[y]=z;//并将账号密码保存到p1中
  33. cout<<"New: OK\n";
  34. }
  35. }
  36. }
  37. return ;
  38. }

创建map<key,value> m; 但单映射map中 key和 value 是一对一的关系,不允许重复键值存在,而multimap多映射允许重复键值存在,可以是一对多的关系。map在这道题目上非常好用简单。其实还有解决题目的其他方法,比如用哈希查找法,不过限于目前的能力,还不能够写出来,还需多多学习!

第7章 PTA查找练习题的更多相关文章

  1. 第三十五章 Linux常规练习题(二)参考答案

    一.练习题一 1.删除用户基本组shanghai03.发现无法正常删除,怎样才能将其删除掉,不能删除用户. groupdel shanghai03 移除其所属组的用户 2.打开多个xshell窗口连接 ...

  2. 第三十四章 Linux常规练习题(一)参考答案

    一.练习题一 1.超级用户(管理员用户)提示符是___#_,普通用户提示符是___$_. 2.linux关机重启的命令有哪些 ? 关机命令 重启命令 shutdown -h now shutdown ...

  3. 第三十三章 linux常规练习题(二)

    一.练习题一 1.删除用户基本组shanghai03.发现无法正常删除,怎样才能将其删除掉,不能删除用户.2.打开多个xshell窗口连接登录同一虚拟机,使用不同的用户登录多次,分别使用w和who命令 ...

  4. 第三十二章 Linux常规练习题(一)

    一.练习题一 1.超级用户(管理员用户)提示符是____,普通用户提示符是____.2.linux关机重启的命令有哪些 ?3.bash是什么?4.bash特性, 常见的bash特性有哪些?5.网卡的配 ...

  5. SQL基础教程(第2版)第4章 数据更新:练习题

    行也选取不出来. >> 解答 A 先生使用 BEGIN TRANSACTION 启动了事务处理,然后开始执行 INSERT 语句.因此,在 A 先生使用 COMMIT 确定该更新之前, B ...

  6. python第一章练习题

    本章总节 练习题 1.简述编译型与解释型语言的区别,且分别列出你知道的哪些语言属于编译型,哪些属于解释 编译型:把源代码编译成机器语言的可执行文件,程序执行的时候执行可执行文件即可. 优点:程序执行不 ...

  7. [数据结构 - 第8章] 查找之哈希表(C语言实现)

    首先是需要定义一个哈希表的结构以及一些相关的常数.其中 HashTable 就是哈希表结构.结构当中的 elem 为一个动态数组. #define HASHSIZE 12 // 定义哈希表长为数组的长 ...

  8. ASM:《X86汇编语言-从实模式到保护模式》第16章:Intel处理器的分页机制和动态页面分配

    第16章讲的是分页机制和动态页面分配的问题,说实话这个一开始接触是会把人绕晕的,但是这个的确太重要了,有了分页机制内存管理就变得很简单,而且能直接实现平坦模式. ★PART1:Intel X86基础分 ...

  9. awk巩固练习题

    第1章 awk数组练习题 1.1 文件内容(仅第一行) [root@znix test]# head -1 secure-20161219 access.log ==> secure-20161 ...

随机推荐

  1. hdu 4609: 3-idiots (FFT)

    题目链接 题意:从N个数中,选出三个两两不同的数,求这三个数能够作为一个三角形的三边长的概率. 题解:用一个数组num[]记录大小为 i 的数出现的次数,通过 num[] 卷 num[] 得到 num ...

  2. logstash+redis收集负载均衡模式下多台服务器的多个web日志

    一.logstash的简介 一般我们看日志来解决问题的时候要么 tail+grep 要么 把日志下载下来再搜索,可以应付不多的主机和应用不多的部署场景.但对于多机多应用部署就不合适了.这里的多机多应用 ...

  3. IDEA unable to find valid certification path to requested target

    一.报错 Could not transfer artifact org.apache.maven.plugins:maven-install-plugin:pom:2.4 from/to alima ...

  4. twint 安装及使用

    分享这个post是自己方便查,还有中文网界对这个东西介绍太少. 更多的就看github项目twint吧. Installation: git+pip3: git clone https://githu ...

  5. 重塑云上的 Java 语言

    音乐无国界,但是音乐人有国界. 云原生亦如此.虽没有限定的编程语言,但应用所使用的编程语言已经决定了应用部署运行的行为. Java 诞生于20年前,拥有大量优秀的企业级框架,践行 OOP 理念,更多体 ...

  6. HDU 4300 Clairewd's message ( 拓展KMP )

    题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0].'b'对应str[1]……以此类推.接下来一行给你一个另一个字符串,这个字符串由密文+明文 ...

  7. [luogu]P1053 篝火晚会[数学][群论]

    [luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...

  8. 字符串处理工具Guava使用总结

    字符串处理工具Guava使用总结 在java开发过程中对字符串的处理是非常频繁的,google的guava工具对字符串的一些处理进行优化,使我们开发过程中让自己的代码看去更加美观,清爽. 1:mave ...

  9. 再谈 COW、ROW 快照技术

    目录 目录 前言 快照与备份的区别 快照技术 增量快照之 COW 增量快照之 row 前言 在经过了一段时间的实践之后,再次回顾 COW/ROW 快照技术的实现原理,温故而知新. 快照与备份的区别 传 ...

  10. 利用Python进行windows系统上的图像识别与点击(Mac OS系统也可以)

    系统环境: 1.安装了python 2.安装了pyautogui模块 windows系统:无需安装依赖模块,在cmd中直接输入pip install pyautogui即可完成安装 Mac OS系统: ...