代码改变世界

查找

2018-05-27 19:05  小鸟游五花  阅读(326)  评论(1编辑  收藏  举报

 

   一、学习总结

1.1查找思维导图

1.2查找学习体会  

  1通过本章我们学习了许多有关查找的方法,比如二叉排序树,AVL树,B-树,B+树,哈希表。通过对于这些查找方法的灵活运用,可以有效的提高我们代码的效率

  2学习到了关于二叉搜索树的特点

  (1).若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  (2)若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  (3)任意节点的左、右子树也分别为二叉查找树。
  (4).中序遍历得到递增序列

二、PTA实验作业

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

    2.2设计思路:

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

    2.3代码截图

             

   2.4PTA提交列表说明 

            

  刚开始没有考虑空树也是二叉搜索树的情况。

(2)2.1题目2:二叉搜索树中的最近公共祖先

  2.2 设计思路

  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代码截图

            

  2.4PTA提交列表说明

  没有判断u或v是否都在树中。

 

  (3)2.1题目3: QQ帐户的申请与登陆

    2.2设计思路:

    根据输入的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代码截图

 

2.4PTA提交列表说明

 

 

  这道题需要用到map函数,所以很多次的编译错误,问了很多同学再结合网络上查找到的资料才勉强做完

3.1 PTA排名(截图带自己名字的排名)

我的总分:105

  1. 阅读代码(必做,1分)

    map函数的基本操作,map函数提供了一个很好的一对一的方法,在处理一对一问题的时候效率会很高,而且删除和增加节点对整体的影响很小,但是map不允许两个元素拥有相同的键值。

从map函数里元素插入

#include <stdio.h>
#include <map>
using namespace std;

int main(){
        map<int, int> mp;
        for (int i = 0; i < 10; i ++){
                mp[i] = i;
        }
        for (int i = 10; i < 20; i++){
                mp.insert(make_pair(i, i));
        }
        map<int, int>::iterator it;
        for (it = mp.begin(); it != mp.end(); it++){
                printf("%d-->%d\n", it->first, it->second);
        }
        return 0;
}

map函数里元素的删除

#include <stdio.h>
#include <map>
using namespace std;

int main(){
        map<int, int> mp;
        for (int i = 0; i < 20; i++){
                mp.insert(make_pair(i, i));
        }

        mp.erase(0);

        mp.erase(mp.begin());

        map<int, int>::iterator it;
        for (it = mp.begin(); it != mp.end(); it++){
                printf("%d->%d\n", it->first, it->second);
        }
map函数元素查找

#include <stdio.h>
#include <map>
using namespace std;

int main(){
        map<int, int> mp;
        for (int i = 0; i < 20; i++){
                mp.insert(make_pair(i, i));
        }

        if (mp.count(0)){
                printf("yes!\n");
        }else{
                printf("no!\n");
        }

        map<int, int>::iterator it_find;
        it_find = mp.find(0);
        if (it_find != mp.end()){
                it_find->second = 20;
        }else{
                printf("no!\n");
        }

        map<int, int>::iterator it;
        for (it = mp.begin(); it != mp.end(); it++){
                printf("%d->%d\n", it->first, it->second);
        }
        return 0;
}