這兩週學了不少查找方面的知識,查找是一個很重要的學習板塊,查找分爲線性表查找,樹表查找,哈希表查找等,順序表查找包括順序查找,折半查找,索引存儲結構和分塊查找,其中索引存儲結構和分塊查找的執行效率高,普遍用於搜素引擎,字典就是分塊查找的應用。樹表查找分爲二叉排序樹,平衡二叉樹,B-樹和B+樹,二叉排序樹的操做較多,須要重點掌握。哈希查找是執行效率高的查找。哈希衝突的解決方法有開放地址法和拉鍊法。
BinTree Insert( BinTree BST, ElementType X ) { if(!BST){ 若是是空樹創建節點 } 根據數據大小創建左右節點 } BinTree Delete( BinTree BST, ElementType X ) { if(BST==NULL) { printf("Not Found\n"); } else { 比較字符大小,不斷查找節點 找到節點時,經過課本上講的方法,刪除節點並用合適的節點代替該節點的位置 } return BST; } Position Find( BinTree BST, ElementType X ) { if(BST==NULL) return NULL; X比節點數據大,則遍歷右孩子 X比節點數據小,則遍歷左孩子 X和節點數據相同則return該結點 } Position FindMin( BinTree BST ) { if(BST){ 不斷地找左孩子直到沒有左孩子 } } Position FindMax( BinTree BST ) { if(BST) { 不斷地找右孩子直到沒有右孩子 } }
Q1:本題在一開始設計得時候一直出現段錯誤。 A1:查找結果的過程當中發現,本題缺少對節點是否爲空的判斷,致使出現段錯誤。 Q2:以後調試,有一些答案錯誤。 A2:答案錯誤的緣由是在建樹的時候我犯了低級錯誤,使用可兩個Right。
bool IsBST ( BinTree T ) { 遍歷節點,當節點爲空時二叉樹爲空 對節點進行判斷,若是左子樹的子節點大於根節點或者右子樹的子節點大於根節點,則非二叉搜索樹 利用遞歸層層遍歷子節點,若是出現左孩子大於根或者右孩子小於根,則不是二叉搜索樹。 }
Q1:本題出現多種答案錯誤。 A1:調試了好幾回,檢查了好幾回,發現代碼沒有明顯錯誤,從新閱讀題目,發覺審題出現錯誤,搜索二叉樹的左節點的孩子所有要比根節點小,右孩子的孩子所有要比根節點大,新添加一段代碼,得出正確答案
int Find(Tree T,int x) { 判斷是否有節點存在 } int LCA( Tree T, int u, int v ) { 樹爲空或找不到目標節點,返回error 根據搜索樹的規律,祖先節點的數據的大小必然在兩個節點之間,同時最早出現的那個爲祖先節點。 }
Q1:本道題理解起來比較困難,尋找共同且最近的祖先節點是什麼意思。我一開始想不到設計思路 A1:參考網上的代碼,其實題目沒有那麼難,本題爲二叉搜索樹,祖先節點的大小一定在兩個查找數據以內,只要先確認查找 的數據是否存在,再和根節點進行比較,最後得出答案。
編寫一個函數來查找字符串數組中的最長公共前綴。 若是不存在公共前綴,返回空字符串 ""。 示例 1: 輸入: ["flower","flow","flight"] 輸出: "fl" 示例 2: 輸入: ["dog","racecar","car"] 輸出: "" 解釋: 輸入不存在公共前綴。 說明: 全部輸入只包含小寫字母 a-z 。
找到最短字符串,以它的長度爲基準,從全部字符串的第一個字符開始對比,若都同樣,ans加上該字符,若不同,返回答案;數組
本道題涉及stl容器,在解決時可用多種方法,本題應用得解題方法時間複雜度爲O(n的平方),能夠解題,在string容器方面的使用值得學習。string min=str[0]這一步寫的好,爲求最短的串,把二維數組化爲一維數組。本題在執行方面,先求出最短串的長度,無形中避免了許多沒必要要的操做,增長了執行效率。以後進行比較,一有不匹配的就跳出循環。函數