查找
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分)
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;
}