1.本周学习总结(0--2分)
1.1思维导图
1.2 谈谈你对查找运算的认识及学习体会。
查找算法用关键字标识一个 数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素。
它有顺序查找、折半查找、分块查找和哈希表查找这几种查找形式。
1.顺序查找:顺序查找适合于存储结构为顺序存储或链接存储的线性表。
2.折半查找:元素必须是有序的,如果是无序的则要先进行排序操作。这也是一种效率较高的查找方法
3.分块查找:分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
4.哈希表查找:哈希查找是一种比较典型和方便的查找方式
2.PTA实验作业(6分)
2.1.题目1:6-2 是否二叉搜索树 (25 分)
2.1.1设计思路(伪代码)
bool IsBST ( BinTree T )
{
if树存在
{
递归左子树T->Left
结点值存入数组a
递归右子树T->Right
}
for(j=1 to i)
{
if(a[j-1]>=a[j])
返回错误
}
返回正确
}
2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.1.3本题PTA提交列表说明。
这道函数题比较简单,提交了两次就过了。第一次在for循环的循环条件里多了一个=号,会导致数组的下标越界
,删去后即答案正确。
2.2.题目2:7-2 航空公司VIP客户查询
2.2.1设计思路(伪代码)
int main()
{
定义一个map,包含身份证和里程数
定义string 类型的id,long long 类型的 len
while(输入航班信息)
if(该id是第一次坐航班)
id对应的关键字初始化为len
if(len小于最低里程)
对应的关键字初始化为最低里程
end if
else if(len小于最低里程)
次关键字=原次关键字+最低里程
else
次关键字=原次关键字+len
end if-else
end while;
while(输入身份信息)
if(找到该id信息)
输出里程数
else
输出info
end if-else
end while;
return 0;
}
2.2.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.2.3本题PTA提交列表说明。
这道题用了map容器,也是一道运用红黑树写法的题目。
代码看起来相对简洁一点。
运行超时:while循环条件写错,变成了一个死循环
一系列的答案错误:
然后开始找别的同学的代码来对比,不断修正错误
2.3 题目3:6-3 二叉搜索树中的最近公共祖先
2.3.1设计思路(伪代码)
int LCA(Tree T,int u,int v)
{
if T 为空,返回 ERROR
else if (Find(T,u)且Find(T,v)) 结点在树中
if T->key>u且T->keykey>v且T->keykey=u或T->key=v 返回 结点T->key
end if
if T->key>u或T->key>v 递归函数LCA(T->Left,u,v)
end if
if T->keykeyRight,u,v)
end if
end if
返回ERROR
}
2.3.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)
2.3.3本题PTA提交列表说明。
错误:
1.因为函数题直接在浏览器上写的,所以第一个编译错误是单词拼写错误,当时没有及时发现。
2.两个if里我遍历的都是左孩子
3.找不到共同祖先时返回值不对
3、阅读代码(-2--2分)
3.1 题目:将一棵树对称(镜像)后输出
3.2 解题思路
先序遍历这棵树的每个结点,如果遍历到的结点有子结点,则交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。
3.3 代码截图
3.4 学习体会
在对树中的元素,无论是左右孩子结点还是数据元素Data,都要注意考虑它们的值是否为空。将一个树对称镜像输出建议运用先序遍历,因为是对称输出,而先序遍历是先访问根结点,再遍历左右孩子结点,这样只需要考虑左右结点的值互换即可。