DS博客作业07--查找

1.本周学习总结

1.1思维导图


1.2学习体会

  • 查找这一章节,有着好几个不同的查找法,所以每题使用的查找方法也可能不一样,查找的代码量没有图代码量那么多,但是还是要用心去学,对于老师一直强调的stl容器,STL容器有顺序容器和关联容器还有容器适配器,c++容器提供一个键值对(key/value)容器,其中map会根据key自动排序,在写题的时候用到容器回方便很多,对于删除和申请空间,容器会自动帮我们做好,需要的头文件#include <map>,关联容器有map、set。还有map是基于红黑树,且键唯一,元素默认按键的升序排序。vector 是数组的内部数据结构,在末尾增加或这删除元素所需要时间与元素无关,在中间或者开头增加或者元素所需时间是随元素数目呈线性变化,它会开辟一定大小的数组,随着元素的增加,空间不够之后,会自动采取扩容,并且遵循以原空间大小的2倍重新开辟一块空间将就空间的元素挪到新的空间上,在继续添加元素的扩容原则。

2.PTA实验作业

2.1题目1:6-2 是否二叉搜索树

2.1.1设计思路

定义全局变量lastNode来保存上一个结点的值
如果树空,返回true
递归左子树,如果左子树为空或者T->Data小等于lastNode,返回false;
lastNode=T->Data;
递归右子树,如果右子树为空,返回false;

2.1.2代码截图

2.1.3本题PTA提交列表及说明

  • 这题最开始的想法假定当前结点值为k,对于二叉树中每个结点,判断器左孩子的值是否小于k,其右孩子的值是都大于k,如果所有结点都满足该条件,则该二叉树是一颗二叉搜索树。但是后面提交时错误的例如层次遍历下序列为(10,5,15,#,#,6,20)它符合上面的条件,但是它并不是一颗二叉搜索树,后面尝试很多方法后发现,判断其左子树最大值是否大于lastNode的值,如果是,则该二叉树不是二叉搜索树,如果不是,则接着判断右子树最小值是否小于或等于last Node的值,如果是,则不是二叉树,反之则是。

2.2题目2 6-3 二叉搜索树中的最近公共祖先

2.2.1设计思路

查找u和v结点是否都存在于树中,有一个不存在则直接返回ERROR;
如果都存在则进行下面步骤:
if(u==v)返回u;
else 
    while(1)
        if(u和v在根节点两侧或者根节点等于u或v的某个值)返回根节点的值;
        if(u和v在同侧)递归调用该侧的子树;

2.2.2代码截图

2.2.3本题PTA提交列表及说明


  • 根据测试点一个个去对,两结点是兄弟和两结点重合 发现是多写了v>p->Key,原以为还有v大于子树结点的情况,是多余的。

2.3题目3 7-1 QQ帐户的申请与登陆

2.3.1设计思路

定义一个string和stirng类型的map的遍历User
输入数据个数n
定义命令符(N和L)
定义用户密码
for i=0 to n
    输入用户账户和密码
    如果读到L即表示登陆
            如果查找的账号与返回指向User的账号相对应则表示账号已经存在,输出ERROR:Exist
            else
                  如果账号已存在但是密码不对应,输出ERROR:Wrong PW;
                  对应的话就输出Login:OK;
     而如果读到的是N,进行新建账户
            如果输入的账号在User中查找与返回指向User 账号相对应,然后数组方式将密码赋给User,并输出New:OK ;
            不对应的话就输出ERROR:Exist;
            

2.3.2代码截图


2.3.3本题PTA提交列表及说明

这题 一直困扰我的是不知道账号密码 该怎么处理,是到底用之前学到字符数组呢还是怎么弄,脑子里一直想,一直无从下手,试了几次以失败告终,后来想 会不会有什么容器 可以帮我处理这些字符对应的问题,果不其然map容器做的到,后面上csdn查找map相关的函数,当中的find()和end()函数恰好能解决账号和密码分别是否对应的问题,find():当所查找的关键key 也就是账号出现时,它返回数据所在对象的位置,如果没有,返回与恩典函数的值相同,end():返回指向User 末尾的迭代器(这个地方我现在也不是很懂)。User.fin(num)==User.end() 很关键,发现map真的很好用,它可以自动建立key-value的对应 也就是这题当中账号和密码的对应,前面定义一个string和stirng类型的map的遍历User,就是作用于此,账号和密码都是字符串类型。这题懂得map存储和遍历的原理之后写起来就简单了。

3阅读代码

3.1题目 未检录人数

3.2解题思路

定义一个长整型的变量ll
把n和num初始化为0;
定义一个字符串类型的s 变量;
输入念的名字数n;
定义一个string ,int类型的my_map;
for(1 to n )
      输入名字字符串s
       如果返回my_map中名字s被查找的个数等于0时,未及时检录的同学数量自增1;
       如果map中不含有插入s的话则bool为true,迭代器指向插入的s;如果map中已经含有s,则bool为false,返回的迭代器指向对应的map中已经存在的s
       输出未及时检录的同学的数量num

3.3代码截图

3.4学习体会

当中学会了更多的map容器里的函数,其中有insert 函数,这个insert函数的实参是map<string,int>。是一个新创建的pair对象,将直接插入到map容器中。my_map.insert(make_pair(s,0));这条语句我愣是理解了很久,后面上网查找各种有关资料,发现对于insert的返回值,是一个pair 类型的,所以中间的参数用到的make_pair函数,而这个函数恰巧可以生成一个pair对象,这个函数很简洁,返回值是一个pair结构,其中第一个元素是一个迭代器,第二个元素是一个bool类型,根据以上结果:如果原来的map中不含有插入的元素,则bool为true,迭代器指向插入的元素;如果map中已经含有插入的元素了,则bool为false,返回的迭代器指向对应的map中已经存在的元素,这题答案虽然很简约但是可以看出功力非常之深厚。不知道 我这 理解对不对。好难啊。
posted @ 2019-06-15 22:44  El-AIRON  阅读(177)  评论(0编辑  收藏  举报