一:学习总结

1.查找的思维导图

2.查找学习体会

我们学习的查找的方法有顺序查找,折半查找和分块查找,顺序查找通过建立顺序表,通过顺序查找找到关键字与k比较,方法和之前学习的线性表很像,构造过程也很相似,所以掌握的还可以,与折半查找相比较,折半查找效率较高。树表的查找中,二叉树的构造比较难,节点的删除插入比较容易出错。平衡二叉树节点的插入和调整是一个需要多写一些习题加以巩固.最后的哈希表表的查找是一种很经典的查找方法  ,很好的提高了计算的时间效率,用拉链法的话ASL不成功的数值更小,但是空间占据较大,还是用开放地址法计算探查次数更加简洁一点。

二:PTA实验作业

2.1是否二叉搜索树

1.设计思路:

使用递归调用搜索二叉树非空左子树所有键值小于根结点的,非空右子树的所有键值都大于跟结点的。分别用两个子函数实现不停找最小左节点最大右节点然后返回函数bool IsBST(),如果左子树的最小值恒小于根节点,右子树最大值恒大于根节点,则返回ture。

2.主要代码截图

3.PTA提交过程:

该题一直都是部分正确,应该是有一个点没有实现,具体原因还在寻找。

2.2 二叉搜索树中的最近公共祖先

1.设计思路:

int find(Tree T,int u)//查看u是否在树中 


     如果树空,返回0; 
     如果u在树中,返回1; 
     如果T->Key<u  
        右子树查找(递归); 
     如果T->Key>u  
        左子树查找(递归); 

int LCA( Tree T,  int u, int v )//寻找u,v的共同祖先 


    如果空,或者find函数返回0
     返回 ERROR;  
    找到相同数值即是公共祖先
    当u>T->Key ,执行LCA(T->Right,u,v); 
    如果u<T->Key,执行执行LCA(T->leftt,u,v); 

2.主要代码截图

 

 

3.pta提交过程

 在LCA函数内返回T->key的条件是u或者v有一个和key相等即可,但之前一直是用“与”的关系,导致一直部分正确.而且在find函数递归调用的时候要返回变量u,因为因为递归用的不好,构造LCA的时候出现大面积错误。u,v两个变量要一个比key大一个比key小,不能只考虑一种情况。

3.QQ帐户的申请与登陆

1.设计思路

调用C++的map函数

{

int n;

输入n个账号信息;

首字母L,老帐户;

申请过后p[y]值改变,

根据p[y]的数值判断老账号是否存在;

p[y],pp[y]值符合要求, 登陆成功;

pp[y]不和要求,密码错误;

}

2.主要代码截图

 

 

3.PTA提交列表

map函数是c++函数,输入输出和头文件的地方要用C++的形式。

三:PTA排名

 

 四:阅读代码

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;
}

 

 


 

 

posted on 2018-05-27 13:59  Noko  阅读(137)  评论(1编辑  收藏  举报