DS博客作业07--查找
1.思维导图及学习体会
1思维导图
2.谈谈你对查找运算的认识及学习体会
- 在查找的学习中,学到了很多种查找的方法,如线性表的查找中就有三种查找方法:顺序查找(这个方法就是我们一般还没学习查找以前最容易想到的方法),折半查找(或者叫二分查找)和分块查找,折半查找是顺序查找的一种改进,时间复杂度达到了O(nlog2n),效率上有了一定的进步。还有树表上的查找,二叉排序树,平衡树的构建,插入,删除;哈希表查找,哈希函数构造方法中的除留余数法会比较侧重一点,还有查找中学会计算成功与不成功的ASL。
- 最近学的东西好像比较多的偏向于理论,还有就是要画图,课堂派作业锻炼了我的电脑画图的能力,查找要学的画图的地方还挺多的,比如画二叉排序树,画平衡二叉树,还有插入的多个调整,LL,LR,RL,RR型的调整,这个比较需要花点功夫去理解,还有B-树的插入删除,这个地方我经常画错,需要好好再复习一下。
2.PTA实验作业
2.1.题目1:二叉搜索树的操作集
2.1.1设计思路(伪代码)
BinTree Insert( BinTree BST, ElementType X )
{
if 空树 then
建立节点
else//不是空树
根据X的大小建立左右节点
}
BinTree Delete( BinTree BST, ElementType X )
{
if 找到最后都没找到
输出 "Not Found\n"
else
比较字符大小,进行递归
找到节点时
删除节点并用合适的节点代替
return BST;
}
Position Find( BinTree BST, ElementType X )
{
if 树空
return NULL;
if X比节点大
找右孩子
if X比节点小
找左孩子
if X和节点相同
return该结点
}
Position FindMin( BinTree BST )
{
if 树不空
递归找左孩子直到没有左孩子
return BST;
}
Position FindMax( BinTree BST )
{
if 树不空
递归找右孩子直到没有右孩子
return BST;
}
2.1.2代码截图
2.1.3本题PTA提交列表说明。
Q1:记得return很重要
A1:在插完的时候没有return,什么都没变,然后一直看自己有没有插错,就是忘了return
Q2:写Position Find函数循环时的条件
A2:要不等于该节点且树不为空,不要想着不等于节点就忘了树空的情况
2.2.题目2:二叉搜索树中的最近公共祖先
2.2.1设计思路(伪代码)
int Find(Tree T, int u)
if T为空 then 不存在
return 0
if x 等于 u then
return 1
if x 大于 u
递归找左孩子;
if x 小于 u
递归找右孩子;
int LCA(Tree T, int u, int v)
if T 为空 then
返回ERROR
if 不在树中
返回ERROR
if 刚好等于本身
返回 T->Key
if 在两数之间
返回 T->Key
if 比最大还大 then
递归找左孩子;
if 比最小还小 then
递归找右孩子;
2.2.2代码截图
2.2.3本题PTA提交列表说明。
Q1:判断该元素是否在树中
A1:刚开始没有考虑的元素是否在树中这件事,后来经过老师讲评知道可以自己写一个函数进行判断
Q2:return什么要注意!
A2:题目要求空树时return ERROR,但我看是int型函数就return 0,然后就错了
Q3:要判断好">","<"的关系
A3:熟悉二叉搜索树的性质左边小右边大
2.3.题目3:QQ帐户的申请与登陆
2.3.1设计思路(伪代码)
输入 n
for i=0 to n then
输入type,username,password
if type=="L" then 新建号码
找不到id时
输出"ERROR: Not Exist"
账号密码不匹配时
输出"ERROR: Wrong PW"
否则
输出"Login: OK" 登陆成功
当找不到id时
s[id]置为password
输出"New: OK"
否则
输出"ERROR: Exist"
else //注册号码
当找不到id时
s[id]置为password
输出"New: OK"
否则
输出"ERROR: Exist"
end if
end for
2.3.2代码截图
2.3.3本题PTA提交列表说明。
Q1:用什么方法可以查找的时候不需写一堆的循环然后直到找到或遍历完呢
A1:可以使用map函数,使用map函数一些遍历查找的过程就不需要我们去写,用find()和end()就可以实现判断是否存在等功能
Q2:怎么实现一个账号对一个密码
A2:用map函数设一个变量,下标为账号,其中元素为密码。
3阅读代码
3.1 题目:出现次数最多的子树元素和
给出二叉树的根,找出出现次数最多的子树元素和。一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身)。然后求出出现次数最多的子树元素和。如果有多个元素出现的次数相同,返回所有出现次数最多的元素
3.2 解题思路
该题的意思是求出二叉树所有子树(包括包含根节点的树)的元素和,然后求出出现元素和次数最多的那些。因为需要求子树,所以肯定是递归最为方便。
两个阶段:
1.遍历二叉树,为每个和统计出现次数,记录在map中
2.遍历map,将最大的值存到vector中
3.3 代码截图
3.4 学习体会
- 在这段代码中使用了STL的一个关联容器map,map提供一对一的数据处理能力,它在我们处理一对一数据的时候很方便,以前老师有多次提到map,但是还是很少去用到它,有时还是去使用一些比较复杂的方法,在前面的PTA题目”QQ帐户的申请与登陆“那题尝试用了一下,然后再通过这段代码再好好学习一下;代码中还使用了vector ,也是STL的一个容器,vector可以容纳许多类型的数据,看起来很方便的样子,老师有介绍过但自己没有用过这个容器,通过代码学一下。也见识到了STL容器可以减少很多代码量。