陈zl

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

一、学习总结

  1.1、查找的思维导图

    

  1.2、查找学习体会

    本章学习了许多有关查找的方法,比如二叉排序树,AVL树,B-树,B+树,哈希表。在学习这些内容的过程中,我遇到了许许多多的问题,例如树表查找较为困难,因为它比起线性表的串联更像是一种一对多的关系,在这种一对多的关系中,将算法的时间和空间复杂度大大降低,这种进阶思想较为难以理解,其他的内容多多少少也有些掌握不足,同样存在各种各样的问题,需要今后的学习来进行补缺补漏。

二、PTA实验作业

    题目一、是否二叉搜索树

    (1).设计思路

       二叉搜索树在中序遍历后得到递增序列,所以先设计一个子函数将所得的二叉树中序遍历,再通过bool IsBST判断其是否为二叉搜索树。

    (2)代码截图

        

    (3)PTA提交列表

      

        遗漏了一个return忘记加上,导致编译错误,其中删改也有种种问题,但没有想明白为什么最后一部分可有可无。

    题目二、二叉搜索树中的最近公共祖先

    (1)设计思路

      1 一种情况为u,v都不在二叉树中

      2一种情况为u,v在二叉树中

      (1)u,v都在左子树上,T=T->Left,递归,求出公共祖先。

            ( 2 )  u ,  v都在右子树上,T=T->Right,递归,求出公共祖先。

      (3)u,v分别在左子树和右子树上,公共祖先就为当前节点指向的key

      (4)u,v有一个在根上,公共祖先就为在根上的那个。

      伪代码描述

       if( T不为NULL)

             返回ERROR

      If( 找不到u或v)

            返回ERROR

      If(u或v等于T->Key)

            返回当前节点

      If ( u和v一个大于T一个小于T)

            返回当前节点

      If( 两个都大于T)

            返回LCA(T->Right,u,v)

      If( 两个都小于T)

           返回LCA(T->Left,u,v)

    (2)代码截图

    

    (3)PTA提交列表

    

    漏加了错误状况,第一次漏掉了一个分号。

    题目三、QQ帐户的申请与登陆

    (1)设计思路

      根据输入的n循环n次

      再根据输入的是N还是L来判断

      伪代码:

        循环n次

        如果是N

        scanf(账号及密码)

        判断账号是否存在

        if存在,输出ERROR: Exist

        else注册成功,输出New: OK

        如果(是L){

        if账号不存在,输出ERROR: Not Exist

        if密码不对,输出ERROR: Wrong PW

        if登录成功,输出 Login: OK}

 

    (2)代码截图

    

    (3)PTA提交列表

    

    忘记改成C++……

三、PTA排名截图

    

四、阅读代码

  #include <map> 
  map是使用红黑树实现的,访问、查找和删除操作的复杂度都是O(log2n),插入会比较慢。

  map,顾名思义就是地图。其实就是key,value的对应。当你需要快速的获取对应key的value的时候,就可以使用map了。例如一个人是有名字,但是这个人还有其他的属性,例如年龄,性别等等。

  这个人就会被封装为一个对象。如果有很多个人,我们需要快速的根据一个人的名字获取对应名字的对象,这个时候map就有用了。

  如果采用数组,我们需要遍历整个数组,才可以根据名字找到这个人。如果是map(以名字为key,以人的对象为value),就可以直接根据名字得到这个对象,就不需要遍历操作了。

    Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作!
    1. map最基本的构造函数;
        map<string , int >mapstring;         map<int ,string >mapint; //这样就定义了一个用int作为索引,并拥有相关联的指向string的指针.
        map<sring, char>mapstring;         map< char ,string>mapchar;
        map<char ,int>mapchar;            map<int ,char >mapint;
    2. map添加数据;
       map<int ,string> maplive;  
       1.maplive.insert(pair<int,string>(102,"aclive"));
       2.maplive.insert(map<int,string>::value_type(321,"hai"));
       3, maplive[112]="April";//map中最简单最常用的插入添加!
    3,map中元素的查找:
       find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。        
       map<int ,string >::iterator l_it;; 
       l_it=maplive.find(112);
       if(l_it==maplive.end())
                  cout<<"we do not find 112"<<endl;
       else cout<<"wo find 112"<<endl;
            4,map中元素的删除:
        删除112;
       map<int ,string >::iterator l_it;;
       l_it=maplive.find(112);
       if(l_it==maplive.end())
      else  maplive.erase(l_it);  //delete 112;

 

posted on 2018-05-27 22:55  陈zl  阅读(176)  评论(2编辑  收藏  举报