DS博客作业07——查找

1.本周学习总结

1.1思维导图

1474718-20190616134354971-563461038.png

1.2.谈谈你对查找运算的认识及学习体会。

查找的内容和前两章树和图相比,要简单许多,在二次搜索树虽然也要用到树,但是也是很简单的树的操作,再加上查找的代码可以使用map这种STL++容器,使得代码简单而且容易理解。
查找的方法有很多,上学期就基本学过的顺序表的查找(数组嘛),二分法查找,还有二叉搜索树,哈希查找,每种查找方法都有自己的利与弊,有的效率高有的操作简单,使用时要灵活。

map容器的常用操作
map<Key, value> m
map<Key, value> m;  构造一个空的map,
empty()  // 如果map 为空,返回true。否则返回 false
ize()    // 返回map 中元素的大小,即 key-value 的个数
操作符[]  // m[k] 返回map 中 Key为 k的元素的value的引用。
      // 如果 k不存在,那么将会插入一个 key为 k的元素,并返回其默认 value。
      // []操作总会将 map的大小 +1
find  查找
      在map中查找key 为 k的元素,返回指向它的迭代器。若k不存在,返回 map::end.
count  计数
      统计map中 key为k的元素的个数,对于map,返回值不是1(存在),就是0(不存在)

2.PTA实验作业

2.1.是否二叉搜索树

1474718-20190616135626570-1879328552.png

2.1.1设计思路

定义全局数组a
中序遍历二叉树
{
if T存在
递归遍历左孩子
得到的数据放入数组a
递归遍历右孩子
}
判断数组a是否升序
{
for j=1 to i
if a[j-1]>a[j]//有一对数据不是升序
return false ;
end if
return true;//全部没问题返回true;
}

2.2.2代码截图

1474718-20190616134929422-1071379409.png

2.2.3本题PTA提交列表说明

1474718-20190616135615133-532524251.png
利用搜索二叉树的特性,即中序遍历得到的顺序为升序,即可快速解答此题。

2.2.二叉搜索树中的最近公共祖先

1474718-20190616141507488-1998389720.png

2.2.1设计思路

Find(Tree T ,int u)
{
if(!T)
return 0;//找不到
end if
如果Key大于要找的数,去左孩子
如果Key小于要找的数,去右孩子
等于的话返回1
}
LCA(Tree T,int u,int v)
{
if(!T) return REEOR//找不到
end if
Key的大小在v和u之间,那T就是公共祖先 return T->Key
Key等于u和v中的一个,那T也是祖先 return T->Key
如果Key比u和v小,去右孩子找祖先
如果Key比u和v大,去左孩子找祖先
前面的判断中不能跳出,则找不到 return ERROR
}

2.2.2代码截图

1474718-20190616141517392-321229963.png

2.2.3本题PTA提交列表说明

1474718-20190616141526635-1721818105.png

2.3QQ帐户的申请与登陆

1474718-20190616150044490-1584185026.png

2.3.1设计思路

本题主要是练习map容器的使用
头文件 #include
默认定义方式 map m;
key为搜索的关键字 ,value为对应的值(主要数据类型)
map<string,int> account;//账号
map<string,string> code;//密码
输入x,y,z //y 账号 z 密码
如果 x==L //老用户登录
if account[y]==0 //账号不存在
输出ERROR: Not Exist4
else if code[y]!=z//账号存在但密码不对
输出ERROR: Wrong PW
end if
if account[y]==1&&code[y]=z//账号存在且密码正确
输出Login: OK
end if
如果 x==N//新用户注册
if account[y]==1//账号已被注册
输出ERROR: Exist
end if
if account[y]==0//账号没有被注册
account[y]=1;
code[y]=z;
输出New: OK
end if

2.3.2代码截图

1474718-20190616151421427-1357895476.png
1474718-20190616151426679-1925266136.png

2.3.3本题PTA提交列表说明

1474718-20190616151435919-1362362855.png

阅读代码

1474718-20190622124648336-2122245696.png

解题思路

 * 先比较第一和第二个,如果有公共的前缀,则用前缀和第三个比较
 * 如果没有公共前缀,就直接返回,后面的不需要比较

代码截图

1474718-20190622131101784-735950396.png

题目是在力扣上找的,网站上提供了好多解题思路。我觉得这是最好最清楚的,从头开始逐个遍历,时间复杂杜并不是很高,但思路很清晰,用代码写出来也很简单。

转载于:https://www.cnblogs.com/qsls8643/p/11031425.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值