1. 程式人生 > >博客作業05--查找

博客作業05--查找

int 祖先 image 二叉搜索樹 rb-tree com img csdn map

1.學習總結(2分)

1.1查找的思維導圖

技術分享圖片
技術分享圖片
技術分享圖片

.2 查找學習體會

查找這章的內容大多是操作多於編程,很多概念如果理不清楚的話很容易出錯,比如說B—和B+樹的插入和刪除操作,有些概念稍微有那麽一點容易混淆,還有平衡二叉樹的調整,刪除之類的,以及哈希表的查找;還有這周學習的map函數,Map的元素是成對的鍵值/實值,內部的元素依據其值自動排序,Map內的相同數值的元素只能出現一次,Multimaps內可包含多個數值相同的元素,內部由二叉樹實現(實際上基於紅黑樹(RB-tree)實現。學習這周主要用到了map函數中的find函數和count函數:

使用count,返回的是被查找元素的個數。如果有,返回1;否則,返回0。註意,map中不存在相同元素,所以返回值只能是1或0。

使用find,返回的是被查找元素的位置,沒有則返回map.end()。

詳細操作見鏈接:https://www.cnblogs.com/Deribs4/p/4948351.html

2.PTA實驗作業(4分)

2.1 題目1:6-3 二叉搜索樹中的最近公共祖先(25 分)

技術分享圖片

2.2 設計思路

解題思路:首先判斷u,v 是否在樹中,若不在,返回ERROR,若在,判斷u,v是否同在樹的左子樹或右子樹或分別在樹的左右子樹,然後再根據其關系找出最近公共祖先

偽代碼:

       Tree p;定義flag=0;
       p=T;
       if p不為空 
          if(p->Key等於u)
             flag=1;break;
          else if  p->Key大於u
              p=p->Left;
          else
              p=p->Right;
        if  flag= 0;返回ERROR 
        同理判斷v是否在樹中
        p=T; 
         while(P不為空)
            if(u,v都小於p->Key)
               p=p->Left;
            else if(u,v都大於p->Key)
               p->Right;
            else
                break;
                
          返回 p->Key;
          end

2.3 代碼截圖

技術分享圖片
技術分享圖片
技術分享圖片

2.4 PTA提交列表說明

技術分享圖片

這題基本上沒什麽太大的問題,其做題思路呢就是:先判斷u,v在樹中是否存在,若不存在則返回ERROR,若存在則,判斷u,v若都小於根節點,這說明在左子樹上去其最近公共祖先,p=p->Left ,當滿足(u

2.1 題目2:7-1 QQ帳戶的申請與登陸(25 分)

技術分享圖片

2.2 設計思路

解題思路:調用Map函數,若輸入的命令為申請,調用T.find函數檢驗id,若T.find函數等於T.end,說明STL容器中沒有此賬號,將密碼附給賬號,申請成功,否則說明賬號已存在;若輸入命令為老賬戶登錄,調用T.find函數檢驗id,若T.find函數等於T.end,說明賬號輸入錯誤,若T.find函數不等於T.end,說明賬號存在,判斷密碼是否相等,若不等,則密碼輸入錯誤,若相等,則登錄成功

偽代碼

      定義 M;string c,id,pass;
      輸入M;
      while M--
          輸入c,id,pass;
          if  c[0]等於N
             if(T.find(id)!=T.end()) 
             輸出 ERROR: Exist
             else
                 T[id]=pass;
                 輸出 New: OK
          else
             if(T.find(id)==T.end()) 
                輸出ERROR: Not Exist
             else
                if  密碼匹配
                  輸出Login: OK
                else
                   輸出ERROR: Wrong PW 

2.3 代碼截圖

技術分享圖片
技術分享圖片

2.4 PTA提交列表說明

技術分享圖片

這題是看了老師說的調用map函數來做的,一開始的時候不理解T.find和T.end的運用,導致一直寫不出來 ,然後上網百度了下T.find和T.end的用法後才寫出來的,使用find,返回的是被查找元素的位置,沒有則返回map.end()。 map.end()指向map的最後一個元素之後的地址,所以當輸入申請的命令的時候,若T.find函數等於T.end,說明STL容器中沒有此賬號,將密碼附給賬號,申請成功,否則說明賬號已存在;若輸入命令為老賬戶登錄,若T.find函數等於T.end,說明賬號輸入錯誤,若T.find函數不等於T.end,說明賬號存在,判斷密碼是否相等,若不等,則密碼輸入錯誤,若相等,則登錄成功

2.1 題目3:6-2 是否二叉搜索樹(25 分)

2.2 設計思路

解題思路:判斷是否二叉搜索樹,需滿足(1)非空左子樹的所有鍵值小於其根結點的鍵值。(2)非空右子樹的所有鍵值大於其根結點的鍵值。

(3)左、右子樹都是二叉搜索樹。,且由二叉搜索樹的性質可知,左子樹的最大鍵值在最右下角,右子樹的最小鍵值在最左下角,故找到左子樹的最大鍵值,小於根節點,找到右子樹的最小鍵值,大於根節點,則為二叉搜索樹

偽代碼:

      BinTree p;
      if T不為空,返回true;
      if  T的左右子樹都不為空,返回true 
      p=T->Left ;
      if p不為空
          while(P->Right不為空)
             p=p->Right;
             if P->Data大於T->Data
                返回false 
      同理檢驗T的右子樹
      遞歸檢驗右子樹和左子樹是否是二叉搜索樹
      返回 IsBST(T->Left)&&IsBST(T->Right)
      end 

2.3 代碼截圖

技術分享圖片

2.4 PTA提交列表說明

技術分享圖片

這題部分正確的原因主要是忘記判斷當二叉搜索樹的左右子樹為空,它也是二叉搜索樹技術分享圖片,加上這句判斷後答案正確

3.截圖本周題目集的PTA最後排名(3分)

3.1 PTA排名(截圖帶自己名字的排名)

技術分享圖片

3.2 我的總分:2.5

4. 閱讀代碼(必做,1分)

哈希表查找代碼實現 -

https://blog.csdn.net/qq_35644234/article/details/68068293

詳細介紹了哈希表查找的三種解決哈希沖突的方法 ,即線性探測,二次探測,鏈地址法,

5. 代碼Git提交記錄截圖

技術分享圖片

博客作業05--查找