博客作業05--查找
阿新 • • 發佈:2018-05-26
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--查找