博客作业05--查找
1.学习总结
1.1查找的思维导图
1.2 查找学习体会
- 在查找这一章,我听得还算比较认真,但是还是有部分没太清楚(比如说B-树的删除操作,在合并的时候会把自己弄混了)查找这章没有前一章树那么多的代码要记,但是还是要用心学,对于STL容器;c++中有两种类型的容器:顺序容器和关联容器。老师只介绍了map容器,map是key-value形式的,在写题目的时候,使用map会方便很多,容器类自动申请和释放内存,我们无需new和delete操作。需要包含头文件#include
2.PTA实验作业
2.1 题目1:是否二叉搜索树
2.2 设计思路
定义整型数组num用来放每个结点的值,定义i来表示数组的下标
bool IsBST ( BinTree T )函数
if结点为NULL,返回true(空结点也是二叉搜索树)
判断左子树是否是true if(!IsBST(T->Left)),不是返回false(因为只要有一个左子树不满足条件,整棵树都不满足)
把根结点的值存入num,并且i++;
判断i>2并且后一个数是否大于前一个数(中序遍历的序列是有序的)
判断右子树是否是true if(!IsBST(T->Right),不是返回false(因为只要有一个右子树不满足条件,整棵树都不满足)
2.3 代码截图
2.4 PTA提交列表说明
- 一开始我想到的思路是:利用先序遍历,根结点的右孩子的值大于根结点的值,左孩子的值小与根结点的值。在提交的时候,有一个测试点过不了,想了很久,问了老师,老师提示(当右子树的最小值小于根结点的值或者左子树的最大值大于根结点的值时)我写的代码没有考虑到这一情况,然后想了想先序遍历没法考虑这一点,中序遍历得出的序列刚好是升序的,然后利用中序遍历在加上数组存放,就全部正确了。
2.1 题目2:二叉搜索树中的最近公共祖先
2.2 设计思路
定义变量SumMin,SumMax分别存放树中最大值和最小值,p指针指向T
if(!p) return ERROR;
利用循环while(p->Left) p=p->Left;找到最小值并记录下来SumMin=p->Key;
p指回根结点
同理利用while(p->Right)找到最大值,并记录
判断给出的结点值是否超出范围,超出返回ERROR
利用while遍历数组,
if(u和v同时小于根->key) 就往左子树;
if(u和v同时大于根->key) 就往右子树;
end(u和v一个大于一个小于)跳出循环;
返回根->key;
2.3 代码截图
2.4 PTA提交列表说明
- 一开始想用指针写,每个结点都有存放父母地址的结构,但是想想实在太难,想到了二叉搜索树的性质:左子树的结点的值都小于根结点的值,右子树的结点的值都大于根结点的值,判断给出的俩个值是不是一个大于一个小于,如果是则这时的根结点就是我们要找的。
2.1 题目3:航空公司VIP客户查询
2.2 设计思路
定义char型数组存放身份证号,int型变量L存放飞行里程,n存放需要存入的次数,k放最短里程
输入n,k
定义map容器key为string型,value为int型(p[key]=value)
while(n--)开始输入信息
{
输入身份证号和飞行里程
判断飞行里程L是否小于最短里程k,是就用最短里程k替换L;
加入到对应人的飞行里程p[num]中;
}
输入需要查找的信息n
while(n--)查找信息
{
输入想要查找乘客的身份证号num
如果存在该人,输出对应飞行里程p[num];
不存在,输出"No Info
}
2.3 代码截图
2.4 PTA提交列表说明
- 利用map容器十分的容易就可以实现代码,但是测试点2,3都运行超时,我就想一层循环会不会时间复杂度太大,但是发现无法改啊,然后想到老师提醒7-1的时候说cin和cout不行,我就试试改掉代码中的cin和cout,然后就过了。
3.截图本周题目集的PTA最后排名
3.1 PTA排名
3.2 我的总分:145
4. 阅读代码
-
红黑树的查找代码:
-
哈希表的查找代码:
-
红黑树的查找就和二叉搜索树的查找没太大区别,都是利用循环找到与之对应的key值返回就好了,哈希表的查找,利用了解决哈希冲突的线性探测法,找到了就返回。版权声明:原创不易,转载请注明转自weewqrer 红黑树