查找
1.学习总结(2分)
1.1查找的思维导图
1.2 查找学习体会
查找这一块学习了线性表的顺序查找,折半查找。树表的平衡二叉树,二叉排序树,B树的查找,以及哈希表的查找。
这块内容的难点主要在于树一块的递归算法,在阅读别人的代码的时候还能比较轻易的理解,但是在自己编写递归算法的时候经常找不到着手点。
关于哈希表还没在实验或者作业中运用,所以这块内容的熟练度和理解程度偏低。
关于线性表是数据结构前半段一直在学习的内容,所以顺序查找和折半查找都有比较熟练的运用
2.PTA实验作业(4分)
2.1 题目1:6-2 是否二叉搜索树
2.2 设计思路
根据之前所学的二叉树的中序遍历,结合二叉排序树的特性易得中序遍历出来的序列是从小到大依次排序的。因此,这题的思路转变成将二叉树转化为中序遍历得出的序列,再判断序列是否为从小到大依次排序。
伪代码:
int InorderTraversal(BinTree T){
利用递归算法,中序遍历树种所有的结点,并依次存储到数组a中
利用循环依次判断数组中前一位数是否大于后一位数
若大于,则说明不是二叉排序树,返回0.
反之返回1
}
Bool IsBst(BinTree T)
{
若T是空树
是二叉搜索树
中序遍历
如果后一个值都大于前一个值,返回真,否则假
}
2.3 代码截图
2.4 PTA提交列表说明。
前四次提交中,我采用的是通过递归算法,依次判断树中的左子树和右子树是否满足二叉排序树的规则。
但是,并不是树的左子树和右子树都是二叉排序树就说明该树是二叉排序树。
例如以下情况
可以看到,左树和右树都满足二叉排序树的规则,但是,右树中7小于根节点9,显然不满足二叉排序树的规则。
所以这个思路是有漏洞的。
因此我转变思路,将问题转化为判断中序遍历后的序列是否从小到大排列。
2.1 题目2:6-3 二叉搜索树中的最近公共祖先
2.2 设计思路
可分为两种情况:1.u,v不在树中 ,返回error
2.u,v在树中u,v都在左子树上
此时又可以分为3种情况(1)u,v都在左子树,为了寻找更近的公共祖先,T->left
(2)u,v都在右子树上同理
(3)u,v分别位于左子树和右子树,则说明T->key即为最近的公共祖先
2.3 代码截图
2.4 PTA提交列表说明。
2.1 题目3:QQ帐户的申请与登陆
2.2 设计思路
利用Map函数
map<string,int>mp1;
map<string,string>mp2;
mp1中的int为0时说明账号未被注册,1的时候说明账号已被注册
伪代码:
int main()
{
输入操作次数n;
定义串x y z;
while(操作次数n--)
{
输入串x,y,z
if(x=="N") /*注册操作*/
{
当mp1[y]==1时,说明账号已经注册,输出ERROR: Exist
否则
{
将mp1[y]赋值1,说明账号已被注册
将mp2[y]赋值z,记录账号所对应的密码
输出NEW:OK
}
}
否则为登录操作
{
当mp【y】为0时,说明还未注册
输出("ERROR: Not Exist\n");
否则
{
mp2【y】不等于z时说明密码不正确
输出("ERROR: Wrong PW\n");
反之为密码正确
输出("Login: OK\n");
}
}
}
}
2.3 代码截图
2.4 PTA提交列表说明。
前两次错误是采用线性表查找,出现各种错误。
后面自学了map函数,但是输出过程中没有换行,所以格式错误。添加换行符后答案正确
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步