鍵樹又稱數字查詢樹(digital search tree)。
它是一棵度大於等於2的樹,樹中的每個結點中不是包含乙個或幾個關鍵字,而是只含有組成關鍵字的符號。
例如,若關鍵字是數值,則結點中只包含乙個數字;若關鍵字是單詞,則結點中只包含乙個字母字元。
這種樹會給某種型別關鍵字的表的查詢帶來方便。
如下圖所示為一棵鍵樹:
從根到葉子結點路徑中結點的字元組成的字串表示乙個關鍵字,葉子結點中的特殊符號$表示字串的結束。
在葉子結點中還含有指向該關鍵字記錄的指標。
為了查詢和插入方便,我們約定鍵樹是有序樹,即同一層中兄弟結點之間依所含符號自左至右有序,並約定$小於任何字元。
鍵樹中每個結點的最大度d和關鍵字的「基」有關,若關鍵字是單詞,則d=27,若關鍵字是數值,則d=11。
鍵樹的深度h則取決於關鍵字中字元或數字的個數。
通常,鍵樹可有兩種儲存結構,分別稱為雙鏈樹和trie樹。
以樹的孩子兄弟鍊錶來表示鍵樹,則每個分支結點包括三個域:
symbol域:儲存關鍵字的乙個字元;
first域:儲存指向第一棵子樹根的指標;
next域:儲存指向右兄弟的指標。
同時,葉子結點不含first域,它的infoptr域儲存指向該關鍵字記錄的指標。
此時的鍵樹又稱雙鏈樹。
在雙鏈樹中插入或刪除乙個關鍵字,相當於在樹中某個結點上插入或刪除一棵子樹。
結點的結構中可以設定乙個列舉變數表示結點的型別,葉子結點和分支結點。
葉子結點和分支結點都有symbol域和next域。不同的乙個域可以用聯合表示,葉子結點包含infoptr指向記錄,而分支結點是first域指向其第一棵子樹。
雙鏈樹如下圖:
假設給定值為k.ch(0..num-1), 其中k.ch[0]至 k.ch[num-2]表示待查關鍵字中num-1個字元, k.ch[num-1]為結束符$。
從雙鏈樹的根指標出發,順first指標找到第一棵子樹的根結點,以k.ch[0]和此結點的symbol域比較,若相等,則順first域再比較下一字元,否則沿next域順序查詢。
若直至空仍比較不等,則查詢不成功。
下面是演算法表示的**:
雙鏈樹查詢
#define maxkeylen 16typedef若以樹的多重鍊錶表示鍵樹,則樹的每個結點中應含有d個指標域,此時的鍵樹又稱trie樹。struct
keystype;
typedef
enum
nodekind;
typedef
struct
dltnode
;}dltnode,*dltree;
record *searchdltree(dltree t, keystype k)
if(p && i1
)
++i;
}//search end
if(!p)
else
}
(trie是從檢索retrieve中取中間四個字元的,讀音同try)。
若從鍵樹中某個結點到葉子結點的路徑上每個結點都只有乙個孩子,則可將該路徑上所有結點壓縮成乙個「葉子結點」,且在該葉子結點中儲存關鍵字及指向記錄的指標等資訊。
在trie樹中有兩種結點:
分支結點:含有d個指標域和乙個指示該結點中非空指標域的個數的整數域。在分支結點中不設資料域,每個分支結點所表示的字元均有其父結點中指向該結點的指標所在位置決定。
葉子結點:含有關鍵字域和指向記錄的指標域。
trie樹如下圖:
從根結點出發,沿和給定值相應的指標逐層向下,直至葉子結點,若葉子結點中的關鍵字和給定值相等,則查詢成功,若分支結點中和給定值相應的指標為空,或葉子結點中的關鍵字和給定值不相等,則查詢不成功。
演算法表示如下:
trie樹查詢
typedef struct其中ord方法將字元轉換成該字元在字母表中的序號,並假設$的序號為零。trienode
lf; //
leaf node
struct bh; //
branch node
};}trienode,*trietree;
record *searchtrie(trietree t, keystype k)
else
}
(這個for迴圈寫得真dt。)
關於trie樹,這裡有篇博文:
查詢演算法和樹總結
主要是利用了樹查詢的思想,所以時間複雜度為樹的深度,樹的深度性質 具有n個結點的完全二叉樹的深度為 log2n 1,由此匯出二分查詢的時間複雜度為o logn 最好的情況就是o 1 剛好就在mid位置 最好o logn 當資料時有序狀態,達到最差,稱為斜樹,所以最差時間複雜度為o n 如果沒有碰撞的...
查詢演算法和樹歸納
主要是利用了樹查詢的思想,所以時間複雜度為樹的深度,樹的深度性質 具有n個結點的完全二叉樹的深度為 log2n 1,由此匯出二分查詢的時間複雜度為o logn 最好的情況就是o 1 剛好就在mid位置 最好o logn 當資料時有序狀態,達到最差,稱為斜樹,所以最差時間複雜度為o n 如果沒有碰撞的...
多路查詢樹之2 3樹 資料結構和演算法79
讓程式設計改變世界 change the world by program 關於多路查詢樹的講解,我們在這系列教程中主要以b樹來講。別誤會哈,小甲魚沒有罵人,ta真就叫b樹,b 樹。但是我們現在還不能直接講這個,因為直接講不容易接受,所以我們先談下b樹的兩個特例 2 3樹和2 3 4樹。我們要談b樹...