一:学习总结
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;
}