查找這部份內容二叉排序樹較爲重要,二叉排序樹有一個很重要的特色就是它的中序遍歷序列是一個遞增序列,二叉排序樹很大程度上提升了查找效率。還有要掌握如何計算ASL成功和ASL不成功的方法,進行二叉排序樹結點的刪除要掌握它的刪除規則。還有平衡二叉樹的插入結點難度會比較大,要孰知四種類型是怎麼進行調整的,結點的刪除也要考慮進行調整。 B樹的插入、刪除,哈希表的查找,解決哈希衝突的方法,線性探測法、拉鍊法,計算ASL也都是本章的重點。 本章的理論知識較多,要掌握這些操做方法,學會計算ASL,多練習樹結點的插入、刪除。
在函數外先定義一個數組 定義i bool IsBST ( BinTree T ) { if(樹不空) 中序遍歷把結點存到a數組中 遍歷數組a if(a[j-1]>=a[j]) return 0; return 1; }
Q1:都是部分正確 A1:判斷是否二叉搜索樹,能夠根據它中序遍歷獲得的序列是遞增序列這個性質,進行判斷。部分正確是由於我一開始把i=0定義在函數內,這樣每次調用函數,i的值都只會從0開始,數組裏面也只有一個數。因此不是二叉搜索樹的也會輸出Yes,形成部分正確。i=0應該定義在函數外,就能保證把中序遍歷的序列存到數組中。
void InsertHT(HashTable ha,int &n,KeyType k,int p) { int i,adr; adr=k%p; if(數組ha[adr]是空的) { 把k放到數組ha[adr]中 k的探測次數置爲1 } else { i=1; do { adr=(adr+1)%p; i++; }while(ha[adr]不爲空); 把k放到數組ha[adr]中 k的探測次數置爲i } 哈希表數據個數n++ } void CreateHT(HashTable ha,KeyType x[],int n,int m,int p) { int i,j=n; 遍歷哈希表 給ha[i].key、ha[i].count置初值 n=0; for(i=0;i<j;i++) 調用InsertHT函數,把x[i]插入哈希表中 } int SearchHT(HashTable ha,int p,KeyType k) { int i=1,adr,j; adr=k%p; while(ha[adr]是空的且ha[adr]不等於k) { i++ 線性探測adr=(adr+1)%p } if(ha[adr].key==k) return adr; else { uns_count=i; return -1; } }
Q1:仍是部分正確問題 A1:這題是按書上代碼寫的,有一些細節作了改變,函數的參數和書上不徹底相同。處理探測失敗的狀況時,沒看清楚題目,直接return -1,沒有把探測次數賦值給uns_count。改完之後,發現仍是部分正確,探測失敗的仍是答案錯誤。以爲挺奇怪的,明明按書上的思路寫的。後來把哈希表裏的內容輸出看了一下,發現裏面竟然有重複的數據,看來插入的時候出錯了。書上用了兩個變量來存放輸入數據個數、哈希表數據個數,而該題只有一個n。原來把x數組裏面的數據插入哈希表時,循環條件爲i<n,但n同時又要統計哈希表數據個數,就出錯了。因此我用j先保存了初始的n,循環條件改成i<j,就解決了。
int n; string a,b,c; cin>>n; while(n--) { 輸入a,b,c if(a == "N") { if(帳號在map容器中找不到) { mp[b]的值置爲密碼 輸出建立成功 } else 輸出帳號已經存在 } else { if(帳號在map容器中找不到) 輸出帳號不存在 else if(帳號密碼不等於c) 輸出密碼錯誤 else 輸出登陸成功 } } }
這題用map容器解決會方便許多,也好理解,從這題也瞭解到了一點map容器的使用。若用常規作法,新申請賬戶的狀況下,判斷該帳號是否已經存在,應該會很麻煩。使用了map容器代碼量也很少,像查找功能均可以直接使用,不用再本身寫代碼。
峯值元素是指其值大於左右相鄰值的元素。 給定一個輸入數組 nums,其中 nums[i] ≠ nums[i+1],找到峯值元素並返回其索引。 數組可能包含多個峯值,在這種狀況下,返回任何一個峯值所在位置便可。
該題要找峯值元素,而不是最大值,只要找到一個比它前面的數大,也比它後面數大的數就是峯值。但題目要求返回該數的索引,因此找到的數的索引爲它後面那個數的索引減1.
找峯值和找最大值不一樣,峯值就是數學上的極大值,只要判斷一個數比它先後的數都大便可。判斷好該數大於它前面的數後,只要判斷該數大於它後面的數就可中止尋找,這題採用的方法是比較容易理解的。