DS博客作业07--查找

1.本周学习总结(0--2分)

1.1.思维导图


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

这最后的这两周学习了查找,对一个元素的增删改,首先需要的就是需要查找,查找用关键字标识的一个数据元素,查找时根据给定的某个值,在表中确定一个关键字的值等于给定值的记录或数据元素。
在这章的学习里,有比较熟悉的线性表查找,数表查找运用了二叉树结构,二叉排序树的查找和树形有关,可以将其调整为平衡二叉树,根据失衡点,进行LL,RR,LR,RL三种调整,对于
树的节点增删改都是查找的重要要点
哈希表查找,之前有提过哈希数组,时间复杂度可以达到O(1),但是缺点就是要解决哈希冲突的问题,相对应的解决冲突的方法在上面的思维导图有提到

2.PTA实验作业(6分)

本周要求挑3道题目写设计思路、调试过程。设计思路用伪代码描述。题目选做要求:原则上题目选择越难,代码量越大分值越高。

2.1.题目1: 是否二叉搜索树 (25 分)

2.1.1设计思路(伪代码)

bool IsBST ( BinTree T )
{
    if(非树或者非树的左右孩子)
    return true;
    定义树型 TLeft, TRight;
    if(树的左孩子)
    TLeft 往下走 该点左子树最大值;
    if(树的右孩子)
    TRight往下走 该点右子树最大值;
返回 (T->Left?(T->Data>TLeft->Data):1)&&(T->Right?(T->Data<TRight->Data):1);

}

2.1.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)

2.1.3本题PTA提交列表说明。


Q:一开始对左孩子的情况没有考虑进去
A:while(TLeft->Right) TLeft = TLeft->Right;

2.2.题目1二叉搜索树中的最近公共祖先 (25 分)

2.2.1设计思路(伪代码)

int Find( Tree T,int u)
{
    if(树为空)
    return 0;
    if(关键字>u) return Find(T->Left,u);
    if(关键字<u) return Find(T->Right,u);
    if(关键字=u) return 1;
}
int LCA( Tree T,  int u, int v )
{
     if(树为空)
    返回 ERROR;
    if要查找的数存在
    遍历到的结点大小在v和u之间,则该节点就是祖先
    return T->Key;
    遍历到的结点大小在v和u之间,则该节点就是祖先
    return T->Key;
    以下两个if表示两个结同在遍历到的结点的一侧
    return LCA(T->Right,u,v);
    否则: return LCA(T->Left,u,v)
    end if
返回 ERROR;
}

2.2.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)

2.2.3本题PTA提交列表说明。


A:共同的祖先节点的关键在于向下的孩子们的关系

2.3.题目1:航空公司VIP客户查询 (25 分)

2.3.1设计思路(伪代码)

#include<bits/stdc++.h>(万能的编译预头,几乎包含所以的c/c++头文件)
    map<string,int> m
    定义 n,mi,k,e;
    定义string类 s;
int main()
{
    s.resize(20)(指定容器有效的元素个数20)
    输入n mi
    for(0 to n)
        身份证号码输入进s数组中;
        输入最低里程k,	if(k<mi) k=mi;
        m[s] += k;
    end for
    while(e to o)
   身份证号码输入进s数组中;
   定义we=m[s];
    if(不为we)输出”No Info“;
    else 输出 m[s];

2.3.2代码截图(注意,截图,截图,截图。不要粘贴博客上。)

2.3.3本题PTA提交列表说明。


Q:这题难点在于对身份证这个常常的字符串的处理
A:使用图和string类可以大大简短代码量

3、阅读代码(-2--2分)

找一份和查找运算相关代码,谈谈你对这个代码认识体会。考研题种关于查找、二叉搜索树内容。

3.1 题目

3.2 解题思路

解法一,递归法:
递归方法是分别遍历一个节点的右节点和左节点,因为是从右边看过来,所以我们需要首先遍历右节点。这里有个疑问,当遍历左节点时候,怎么判定它右边没有其他节点了呢?这里我们用到一个变量level,
对于同一层的节点,如果res数组的大小已经等于level了,说明右边已经有节点存入数组了,该节点就不用再保存。一直递归下去就可以得到结果

解法二,非递归法:
这道题要求我们打印出二叉树每一行最右边的一个数字,实际上是求二叉树层序遍历的一种变形,我们只需要保存每一层最右边的数字即可,还是需要用到数据结构队列queue,遍历每层的节点时,
把下一层的节点都存入到queue中,每当开始新一层节点的遍历之前,先把新一层最后一个节点值存到结果中

3.3 代码截图

递归方法:

非递归方法:

3.4 学习体会


    二叉树的右视图,相当于对二叉树进行层序遍历,将每一层的最后一个节点存入最终的结果即可,递归法与非递归法都有特点,不过递归法更加贴近二叉树的常规做法

  • 题目以及解法来源于 力扣网。
原文地址:https://www.cnblogs.com/asings/p/11032056.html