查找
1. 学习总结
1.1 查找的思维导图
1.2 查找学习体会
通过学习数据结果的查找内容,我理解了查找的基本概念。掌握了包括顺序查找、折半查找和分块查找的线性表的各种查找算法的基本思路、算法实现和查找效率等,还有掌握包括二叉排序树、AVL树、B-树和B+树的各种树表的查找算法的基本思路、算法实现和查找效率等。还学习了一种特别的存储方法的查找:哈希表。通过这几周的学习,可以初步的运用各种查找算法解决一些综合性问题。
2. PTA实验作业
题目1:6-2是否二叉搜索树
1. 设计思路
定义一个全局变量用于后面的节点值比较
bool IsBST(BinTree T)
{
if(T是空树)
T是搜索二叉树
else
{
if(T的左子树不是搜索二叉树或者左子树有一个节点的值大于根节点)
T不是搜索二叉树
如果T的左子树是搜索二叉树则再遍历其右子树,重复上述操作
}
}
2. 代码截图
3. PTA提交列表说明
①没有将该树只有一个节点和分别判断左右子树都是搜索二叉树的情况写进代码,导致部分正确。
②实现了二叉搜索树只有一个节点也是二叉搜索树的执行,但是判断左右子树都是搜索二叉树的情况还没有很好的实现。
题目2:二叉搜索树中的最近公共祖先
1. 设计思路
int LCA( Tree T, int u, int v )
{
If(u或v不在T树中)
找不到祖先 返回error
If(T是空树)
没有祖先 返回error
else
{
if(u和v都大于T的根节点)
则他们的最近公共祖先在T的右子树中,递归查找T的右子树
if(u和v都小于T的根节点)
则他们的最近公共祖先在T的左子树中,递归查找T的左子树
if(u和v的大小分居T的根节点两侧)
则T的根节点就是他们的最近公共祖先,返回T的根节点的值
}
2. 代码截图
3. PTA提交列表说明
当u和v都大于或者都小于T的根节点时,用循环T的右或左子树中他们的最近公共祖先,导致运行超时。
题目3:QQ账户的申请与登陆
1. 设计思路
While(依次输入n行QQ账号)
{
输入账号类型,QQ账号,QQ密码
If(是老账号)
{
If(这个账号还没有申请过)
不存在的错误
Else if(密码错误)
密码错误
Else
登陆成功
}
If(是新账号)
{
If(这个账号还没有申请过)
申请成功
Else if(账号已经存在)
账号存在
}
}
2. 代码截图
3. PTA提交列表说明
用了上学期C的办法结果只能做到部分正确,后来上网查了C++ map函数的用法,参考了网上的答案。
3.1PTA排名
3.2 我的总分:2分
4.阅读代码:折半查找的递归实现
#include <stdio.h>
#define MAXL 100
typedef int KeyType;
typedef char InfoType[10];
typedef struct
{
KeyType key; //KeyType为关键字的数据类型
InfoType data; //其他数据
} NodeType;
typedef NodeType SeqList[MAXL]; //顺序表类型
int BinSearch1(SeqList R,int low,int high,KeyType k)
{
int mid;
if (low<=high) //查找区间存在一个及以上元素
{
mid=(low+high)/2; //求中间位置
if (R[mid].key==k) //查找成功返回其逻辑序号mid+1
return mid+1;
if (R[mid].key>k) //在R[low..mid-1]中递归查找
BinSearch1(R,low,mid-1,k);
else //在R[mid+1..high]中递归查找
BinSearch1(R,mid+1,high,k);
}
else
return 0;
}
int main()
{
int i,n=10;
int result;
SeqList R;
KeyType a[]= {1,3,9,12,32,41,45,62,75,77},x=75;
for (i=0; i<n; i++)
R[i].key=a[i];
result = BinSearch1(R,0,n-1,x);
if(result>0)
printf("序列中第 %d 个是 %d\n",result, x);
else
printf("木有找到!\n");
return 0;
}