首页 > 其他 > 详细

博客作业05--查找

时间:2018-05-26 21:43:43      阅读:205      评论:0      收藏:0      [点我收藏+]

1.学习总结

1.1查找的思维导图

1.2 查找学习体会

2.PTA实验作业

2.1 题目1:6-2 是否二叉搜索树

2.2 设计思路

bool IsBST ( BinTree T )
{
    定义静态整型变量min=-32678作为判断的最小值
    如果树空 返回null
    递归调用函数IsBST (T->Left)
    if(T->DATA大于min)
    则min=T->DATA
    else返回false
    递归调用函数IsBST并指向该树的右子树
}

2.3 代码截图

技术分享图片

2.4 PTA提交列表说明

技术分享图片

前两次错误是因为用递归调用遍历左子树之后忘记遍历右子树造成的,通过与室友讨论解决

2.1 题目2:6-3 二叉搜索树中的最近公共祖先

2.2 设计思路

int LCA( Tree T,  int u, int v )
{
    if(树空)  返回ERROR
    if(u或v不在树中)  返回ERROR //由find函数解决 细节不表。
    if(当前T->key结点等于u或等于v)  返回当前节点
    if(u在当前节点的右子树且v在当前节点左子树 或 u在当前节点左子树或v在当前节点右子树 即u、v分别在当前节点左右子树) 返回当前节点
    if(u在当前节点右子树)  递归调用 LCA(T->Right,u,v)并返回最终值
    if(u在当前节点左子树)  递归调用LCA(T->Left,u,v)并返回最终值
}

2.3 代码截图

技术分享图片

2.4 PTA提交列表说明

技术分享图片

第一次提交是由于find函数中判断返回值出错导致的答案部分正确,第二次提交索性没有判断u或v不在树中的情况,结果只有两个测试点没过,第三次仔细修改后发现find函数中返回值0和1恰好相反了,通过修改代码解决。

2.1 题目3:7-1 QQ帐户的申请与登陆

2.2 设计思路

int main()  
{
    定义一个整型变量N用来储存测试次数  输入N
    创建一个map容器  map<long int, string>mapQQ;
    定义字符变量 choose
    定义long int型变量qq_number来储存qq号 string型变量qq_password储存测试需要的密码
    map<long int, string>::iterator iter;   //前向迭代器 
    for (int i = 0; i < N; i++)
    {
         输入choose、qq_number和qq_password
         对qq_number进行查找
         if(choose==N){
             if(容器中已有此qq账号)  返回ERROR: Exist
         else
             创建这个号码并储存于map容器中
             返回New: OK
         if(choose==L)
             if(容器中已有此qq账号)  
                 判断qq号与密码是否匹配 如果匹配输出"Login: OK 如果不匹配输出ERROR: Wrong PW
             如果容器中没有此qq号 输出"ERROR: Not Exist
      return 0;
}

2.3 代码截图

技术分享图片
技术分享图片

2.4 PTA提交列表说明

技术分享图片

因为本题运用到map容器,所以修改次数较多,而且掌握不是特别熟练 ,系统多试几次就会崩溃,后经百度和问室友解决,也使我了解到了map这个容器。

3.截图本周题目集的PTA最后排名

3.1 PTA排名(截图带自己名字的排名)

3.2 我的总分

4. 阅读代码

//HashMap中红黑树的查找函数find()实现  
/** 
         * 调用树的find()函数 
         */  
        final TreeNode<K,V> getTreeNode(int h, Object k) {  
            return ((parent != null) ? root() : this).find(h, k, null);  
        }  
[java] view plain copy
/** 
         * 从根节点p开始查找指定hash值和关键字key的结点 
         * 当第一次使用比较器比较关键字时,参数kc储存了关键字key的 比较器类别 
         */  
        final TreeNode<K,V> find(int h, Object k, Class<?> kc) {  
            TreeNode<K,V> p = this;  
            do {  
                int ph, dir; K pk;  
                TreeNode<K,V> pl = p.left, pr = p.right, q;  
                if ((ph = p.hash) > h)           //如果给定哈希值小于当前节点的哈希值,进入左节点  
                    p = pl;  
                else if (ph < h)             //如果大于,进入右结点  
                    p = pr;  
                else if ((pk = p.key) == k || (k != null && k.equals(pk)))  //如果哈希值相等,且关键字相等,则返回当前节点  
                    return p;  
                else if (pl == null)        //如果左节点为空,则进入右结点  
                    p = pr;  
                else if (pr == null)        //如果右结点为空,则进入左节点  
                    p = pl;  
                else if ((kc != null ||  
                          (kc = comparableClassFor(k)) != null) &&  
                         (dir = compareComparables(kc, k, pk)) != 0)        //如果不按哈希值排序,而是按照比较器排序,则通过比较器返回值决定进入左右结点  
                    p = (dir < 0) ? pl : pr;  
                else if ((q = pr.find(h, k, kc)) != null)       //如果在右结点中找到该关键字,直接返回  
                    return q;  
                else  
                    p = pl;                             //进入左节点  
            } while (p != null);  
            return null;  
        }  

本次阅读代码根据题目要求去找了红黑树的查找函数find()函数的具体实现,其实是找了段自己也似懂非懂的代码,其实大致能够看懂,但是要深究的话可能会话更多时间,贴出来也方便自己以后借鉴或者学习吧。

博客作业05--查找

原文:https://www.cnblogs.com/llg202827372/p/9092501.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!