DS博客作业07-----查找

1.本周学习总结

1.思维导图

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

查找的PTA题目集比前面树和图的更好做,他对编程的要求不是那么高,只要掌握几种查找的思想,然后利用递归一直找下去就好,代码量上面减少很多。而且,越学习到后面,发现容器越好用,比如编程第一题,就利用map容器不可以有两个相同键值的特点来解决账号已经存在的问题,非常方便。

2.PTA实验作业

2.1.题目1:二叉搜索树的操作集

  • 函数Insert将X插入二叉搜索树BST并返回结果树的根结点指针;
  • 函数Delete将X从二叉搜索树BST中删除,并返回结果树的根结点指针;如果X不在树中,则打印一行Not Found并返回原树的根结点指针;
  • 函数Find在二叉搜索树BST中找到X,返回该结点的指针;如果找不到则返回空指针;
  • 函数FindMin返回二叉搜索树BST中最小元结点的指针;
  • 函数FindMax返回二叉搜索树BST中最大元结点的指针。
输入样例:
10
5 8 6 2 4 1 0 10 9 7
5
6 3 10 0 5
5
5 7 0 10 3

输出样例:
Preorder: 5 2 1 0 4 8 6 7 10 9
6 is found
3 is not found
10 is found
10 is the largest key
0 is found
0 is the smallest key
5 is found
Not Found
Inorder: 1 2 4 6 8 9

2.1.1设计思路

  • 插入函数
if(空树)
    新建叶子节点,并将X的值存入
else
    if(X<当前遍历节点的值)
        递归遍历左子树
    else
        递归遍历右子树

此处有个疑问,不知道为什么我用return Insert(BST->Left,X)就显示全部都找不到,我看书上都可以。。。用BST->Left=Insert(BST->Left,X)就是对的,感觉没差

  • 删除函数
- if(空树或者遍历完都没找到)
    输出Not Found
- else if(X<当前节点的值)
    递归遍历左子树
- else if(X>当前节点的值)
    递归遍历右子树
- else(相等也就是找到了要删除的节点)
    - if(该节点有两个子树)
        定义变量tmp接收查找最大值函数返回的值
        将左子树的最大节点作为新的父亲节点
        调整左子树孩子间关系
    - else(有一个或没有子树)
        tmp暂存该节点的值
        - if(左孩子为空)
            将右孩子作为父亲节点
        - else
            将左孩子作为父亲节点
        free(tmp)释放该节点
return 根节点
  • 查找函数
- if(空树或找到节点)return 根节点BST
- else
    - if(节点值>X)递归遍历左子树
    - else 递归遍历右子树
  • 找最大值函数
- if(树不空)
    while循环遍历找到最右边节点
    根据二叉搜索树特点,此节点是最大的
返回 BST
  • 找最小值函数
与找最大值函数方法一样,遍历找到最左边节点即为最小值
输入样例:
10
5 8 6 2 4 1 0 10 9 7
5
6 3 10 0 5
5
5 7 0 10 3
输出样例:
Preorder: 5 2 1 0 4 8 6 7 10 9
6 is found
3 is not found
10 is found
10 is the largest key
0 is found
0 is the smallest key
5 is found
Not Found
Inorder: 1 2 4 6 8 9

2.1.2代码截图

  • 插入函数
  • 删除函数

  • 查找函数
  • 找最大值函数
  • 找最小值函数

2.1.3本题PTA提交列表说明

2.2 题目2:是否二叉搜索树

2.2.1设计思路

判断是不是二叉搜索树首先想到了老师说的用中序遍历的方法,如果他是递增数列,那么就是一棵二叉搜索树
利用中序遍历思想首先有个问题要解决,就是这么存储遍历的节点值的问题,使得他可以和前一个比较
第一个想到的是数组,但发现这是一个函数题,不能自己随便定义,后面查资料发现可以把数组定义写在函数外面作为全局变量】
如下代码:
定义数字a【100】存储树节点的值
定义IsBST函数利用递归中序遍历判断是不是二叉搜索树
    if(树不空)
        递归遍历左子树
        将节点的值存入数组a,变量 i 记录数组长度
        递归遍历右子树
    end if
    for循环遍历数组 a 
        if(数组后面的值大于他前面的值)
            return false
    循环完后没问题就return true

2.2.2代码截图

2.2.3本题PTA提交列表说明

2.3 题目3:QQ帐户的申请与登陆

输入格式:
输入首先给出一个正整数N(≤100000)随后给出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”。

输入样例:
5
L 1234567890 [email protected]
N 1234567890 [email protected]
N 1234567890 [email protected]
L 1234567890 myQQ@qq
L 1234567890 [email protected]

输出样例:
ERROR: Not Exist
New: OK
ERROR: Exist
ERROR: Wrong PW
Login: OK

2.3.1设计思路

这题和后面航空公司的思路差不多,此处列举一题

2.3.2代码截图

2.3.3本题PTA提交列表说明

3、阅读代码

3.1 题目

3.2 解题思路

3.3 代码截图

3.4 学习体会

猜你喜欢

转载自www.cnblogs.com/zhonghaiqing/p/11025314.html