1.本周学习总结
1.1思维导图
1.2学习体会
- 学习内容:关于线性表的查找不是太陌生,顺序查找和二分查找,在C语言中广泛运用,较为容易掌握;哈希表的话之前只是接触过哈希数组,现在这章学习之后觉得哈希更好用了,要掌握的不仅是代码的编写,还有就是对于哈希查找的过程的了解,计算ASL;这章右接触到一种特殊的树——二叉排序树,不仅要熟练相关代码算法,更是对于树的删除、插入会画图,平衡二叉树调整我觉得很有意思叭,需要判断是否平衡,然后再判断是RL或RR或LL或LR调整,仔细一点就很容易掌握。让我觉得难度最大的还是B-,B+树辽,删除对我来说真的是需要再熟悉一下了,不管是画图还是代码都是让我最头疼的部分,这一块不管在代码还是课堂派作业上,都很薄弱,要重点观察辽!老师还额外补充了map相关的知识和应用
- 学习体会:这一章对比前几章,我感觉更注重知道查找的过程,会画二叉排序树,会调整二叉树,了解哈希查找的过程(之前上课的时候就是这个看书的时候理解错辽意思,上黑板还或错了,好的吧)重点关注对象!B-树的删除我还需要再熟悉一下方法滴,这一章好像每一节都有用到ASL的计算,一定要仔细(因为i真的超级简单),可能因为这章课堂派作业比较多(其实是因为莫得上机考。。。),碰上期末周就忽略了pta,代码真的一拖再拖,导致博客园压力很大辽。
2.PTA实验作业
2.1题目1:是否二叉搜索树
本题要求实现函数,判断给定二叉树是否二叉搜索树。
2.1.1设计思路
【思路——判断中序遍历是否是递增的】
- 建立数组s[100]存放中序序列
- 中序遍历二叉树
递归左子树
s[i++]= T->data
递归右子树
- 判断中序序列是否递增
for j=0 to i
if s[j-1] >= s[j]
return 0
return 1
2.1.2代码截图
2.1.3本题PTA提交列表说明。
说明:
- bug1:刚开始的时候没注意函数名,自己取了一个名字,也是二到爆炸了,查错还查了很久,这些小错误真的应该去编译器查一遍,不能直接再pta上写;
- bug2:刚开始写的时候想把中序序列存到队列里面,没有注意到是C语言编程环境,写完之后才发现,导致编译错误;
- bug3:把中序遍历单独用一个函数写,好像不太能行得通;
- 总结:还是得仔细,看清题目,尤其是函数题,得先看清楚编程环境再下手啊。
2.2 题目2:二叉树的最近公共祖先
在一棵树T中两个结点u和v的最近公共祖先(LCA),是树中以u和v为其后代的深度最大的那个结点。现给定某二叉搜索树(BST)中任意两个结点,要求你找出它们的最近公共祖先。
2.2.1设计思路
【思路——递归】
#####before查找祖先
- 查找结点x是否存在
if T->key == x
return 0;
if T->key > x
Find(T->Left);
if T->key < x
Find(T->Right);
#####when查找祖先
- 空树或者找不到结点时
return error
- 找到共同祖先
返回祖先
- 不在范围之内
return T->key
- u>T->key
return LCA(T->Righrt,u,v);
- u<T->key
return LCA(T->Left,u,v);
2.2.2代码截图
2.2.3本题PTA提交列表说明。
说明:
- bug:在考虑的时候没有考虑超出范围这个条件,不够周全!
- 总结:这种情况较为复杂的时候,应该读清楚题目,罗列所有状况,一个都不能忽略!
2.3 题目3:QQ帐户的申请与登陆
实现QQ新帐户申请和老帐户登陆的简化版功能。最大挑战是:据说现在的QQ号码已经有10位数了。
-
输入格式:输入首先给出一个正整数N(≤10^5 ),随后给出N行指令。每行指令的格式为:“命令符(空格)QQ号码(空格)密码”。其中命令符为“N”(代表New)时表示要新申请一个QQ号,后面是新帐户的号码和密码;命令符为“L”(代表Login)时表示是老帐户登陆,后面是登陆信息。QQ号码为一个不超过10位、但大于1000(据说QQ老总的号码是1001)的整数。密码为不小于6位、不超过16位、且不包含空格的字符串。
-
输出格式:
针对每条指令,给出相应的信息:
1)若新申请帐户成功,则输出“New: OK”;
2)若新申请的号码已经存在,则输出“ERROR: Exist”;
3)若老帐户登陆成功,则输出“Login: OK”;
4)若老帐户QQ号码不存在,则输出“ERROR: Not Exist”;
5)若老帐户密码错误,则输出“ERROR: Wrong PW”。
2.3.1设计思路
【思路——map容器】
- 定义变量c存储命令符L or N
numb存储账号
str存储密码
- 定义一个map容器配对账号和密码
- 遍历n个操作
输入命令、账号、密码
if 注册
if map.find(numb)!=map.end()
输出ERROR:Wrong PW;
else
输出“New: OK”;
map[numb]=str;
if 登陆
if 账号在map里找不到
输出“ERROR: Not Exist”;
else
输出“Login: OK”;
2.3.2代码截图
2.3.3本题PTA提交列表说明。
说明:
- bug1:编程环境又没注意
这道题并不难,主要是了解map的格式,发现map真的超级好用,记得之前课设的时候有要求注册和登陆时对于账户密码的匹配操作,我都是存文件然后判断是否相等这样比较麻烦的操作,但是用map就直接可以解决,很方便,这边记录一下,加深印象,方便以后这方面代码的编写!
3阅读代码
3.1题目:监控二叉树
给定一个二叉树,我们在树的节点上安装摄像头。
节点上的每个摄影头都可以监视其父对象、自身及其直接子对象。
计算监控树的所有节点所需的最小摄像头数量。
3.2解题思路
【函数一 dfs判断结点类型】
if 树空
return 1
if dfs(node->left) == 2 或者 dfs(node->right)==2
ans++;
return 0;
else if dfs(node->left) == 0 或者 dfs(node->right)==0
return 1
else
return 2;
【函数二 计算最小摄像头数量ans】
if 空树
return 0
if dfs(root) == 2
ans++;
3.3 代码截图
3.4学习体会
经过几次阅读代码,感觉力扣上面的题目,大多是给出许多书上没有的概念,比较陌生的东西,但是大体跟书上的代码思路几乎差不多,大量运用递归的算法,这道题开始看到摄像头这个说法会觉得很陌生很奇怪,但是阅读了评论区的代码之后发现其实还是不难的,要计算摄像头的数量,需要先对于给出的树的结点进行分类,分为三种:有监视器的结点,没有监视器但可观的结点和不可观的结点;分清楚之后,再进行统计即可完成,所以在面对陌生的知识块的时候不要害怕,仔细想一想其实还是依据最基本的知识点,在树的应用上,应该最优先想到递归算法,不仅代码量少,效率也比较可观,容易编写,但是也要注意容易出错,要仔细一些。