DS博客作业07--查找

1.本周学习总结

1.1思维导图

1.2学习体会

  • 学习内容:关于线性表的查找不是太陌生,顺序查找和二分查找,在C语言中广泛运用,较为容易掌握;哈希表的话之前只是接触过哈希数组,现在这章学习之后觉得哈希更好用了,要掌握的不仅是代码的编写,还有就是对于哈希查找的过程的了解,计算ASL;这章右接触到一种特殊的树——二叉排序树,不仅要熟练相关代码算法,更是对于树的删除、插入会画图,平衡二叉树调整我觉得很有意思叭,需要判断是否平衡,然后再判断是RL或RR或LL或LR调整,仔细一点就很容易掌握。让我觉得难度最大的还是B-,B+树辽,删除对我来说真的是需要再熟悉一下了,不管是画图还是代码都是让我最头疼的部分,这一块不管在代码还是课堂派作业上,都很薄弱,要重点观察辽!老师还额外补充了map相关的知识和应用
  • 学习体会:这一章对比前几章,我感觉更注重知道查找的过程,会画二叉排序树,会调整二叉树,了解哈希查找的过程(之前上课的时候就是这个看书的时候理解错辽意思,上黑板还或错了,好的吧)重点关注对象!B-树的删除我还需要再熟悉一下方法滴,这一章好像每一节都有用到ASL的计算,一定要仔细(因为i真的超级简单),可能因为这章课堂派作业比较多(其实是因为莫得上机考。。。),碰上期末周就忽略了pta,代码真的一拖再拖,导致博客园压力很大辽。

2.PTA实验作业

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

本题要求实现函数,判断给定二叉树是否二叉搜索树。

2.1.1设计思路

【思路——判断中序遍历是否是递增的】
    - 建立数组s[100]存放中序序列
    - 中序遍历二叉树
            递归左子树
            s[i++]= T->data
            递归右子树
     - 判断中序序列是否递增
            for j=0 to i
                if s[j-1] >= s[j]
                    return 0
            return 1

2.1.2代码截图

2.1.3本题PTA提交列表说明。

说明:
  • bug1:刚开始的时候没注意函数名,自己取了一个名字,也是二到爆炸了,查错还查了很久,这些小错误真的应该去编译器查一遍,不能直接再pta上写;
  • bug2:刚开始写的时候想把中序序列存到队列里面,没有注意到是C语言编程环境,写完之后才发现,导致编译错误;
  • bug3:把中序遍历单独用一个函数写,好像不太能行得通;
  • 总结:还是得仔细,看清题目,尤其是函数题,得先看清楚编程环境再下手啊。

2.2 题目2:二叉树的最近公共祖先

在一棵树T中两个结点u和v的最近公共祖先(LCA),是树中以u和v为其后代的深度最大的那个结点。现给定某二叉搜索树(BST)中任意两个结点,要求你找出它们的最近公共祖先。

2.2.1设计思路

【思路——递归】
     #####before查找祖先
            - 查找结点x是否存在
                      if  T->key == x
                            return 0;
                      if  T->key > x
                            Find(T->Left);
                      if  T->key < x
                            Find(T->Right);
     #####when查找祖先 
            - 空树或者找不到结点时
                    return error
            - 找到共同祖先
                    返回祖先
            - 不在范围之内
                    return T->key
            - u>T->key
                    return LCA(T->Righrt,u,v);
            - u<T->key
                    return LCA(T->Left,u,v);

2.2.2代码截图

2.2.3本题PTA提交列表说明。

说明:
  • bug:在考虑的时候没有考虑超出范围这个条件,不够周全!
  • 总结:这种情况较为复杂的时候,应该读清楚题目,罗列所有状况,一个都不能忽略!

2.3 题目3:QQ帐户的申请与登陆

实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。
  • 输入格式:输入首先给出一个正整数N(≤10^5​​ ),随后给出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”。

2.3.1设计思路

【思路——map容器】
    - 定义变量c存储命令符L or N
                     numb存储账号
                     str存储密码 
    - 定义一个map容器配对账号和密码
    - 遍历n个操作
            输入命令、账号、密码
            if 注册
                if map.find(numb)!=map.end()
                        输出ERROR:Wrong PW;
                else
                        输出“New: OK”;
                        map[numb]=str;
            if 登陆
                if 账号在map里找不到
                         输出“ERROR: Not Exist”;
                else 
                          输出“Login: OK”; 

2.3.2代码截图

2.3.3本题PTA提交列表说明。

说明:
  • bug1:编程环境又没注意
    这道题并不难,主要是了解map的格式,发现map真的超级好用,记得之前课设的时候有要求注册和登陆时对于账户密码的匹配操作,我都是存文件然后判断是否相等这样比较麻烦的操作,但是用map就直接可以解决,很方便,这边记录一下,加深印象,方便以后这方面代码的编写!

3阅读代码

3.1题目:监控二叉树

给定一个二叉树,我们在树的节点上安装摄像头。

节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。

3.2解题思路

【函数一 dfs判断结点类型】
        if   树空
            return 1
        if   dfs(node->left) == 2 或者 dfs(node->right)==2
             ans++;
             return 0;
        else if   dfs(node->left) == 0 或者 dfs(node->right)==0
             return 1
         else
                return 2;
   【函数二 计算最小摄像头数量ans】
          if 空树
                return 0
          if dfs(root) == 2
                ans++;

3.3 代码截图

3.4学习体会

经过几次阅读代码,感觉力扣上面的题目,大多是给出许多书上没有的概念,比较陌生的东西,但是大体跟书上的代码思路几乎差不多,大量运用递归的算法,这道题开始看到摄像头这个说法会觉得很陌生很奇怪,但是阅读了评论区的代码之后发现其实还是不难的,要计算摄像头的数量,需要先对于给出的树的结点进行分类,分为三种:有监视器的结点,没有监视器但可观的结点和不可观的结点;分清楚之后,再进行统计即可完成,所以在面对陌生的知识块的时候不要害怕,仔细想一想其实还是依据最基本的知识点,在树的应用上,应该最优先想到递归算法,不仅代码量少,效率也比较可观,容易编写,但是也要注意容易出错,要仔细一些。


posted @ 2019-06-16 16:29  何汐  阅读(239)  评论(0编辑  收藏  举报