trie樹(字典樹)
阿新 • • 發佈:2017-10-08
arc delete png 技術分享 我只 blog 存在 紅色 style
核心思想:
利用字符串的公共前綴來降低查詢時間的開銷以達到提高效率的目的
舉個例子
上圖是由
- am
- as
- tea
- too
- tooth
- two
構成的字典樹。每個節點代表的單詞是從根遍歷到他的路徑,標黃的是當前節點存在單詞
代碼實現:
struct Trie{ Trie *son[26]; bool w;//記錄當前節點是否是單詞; }root;
基本性質:
- 根節點不包含字符,除根節點外每一個節點都只包含一個字符。
- 從根節點到某一節點,路徑上經過的字符連接起來,為該節點對應的字符串。
- 每個節點的所有子節點包含的字符都不相同。
查詢和插入
對於一個單詞,我只要按照它的每個字母從根走到對應的節點,再看這個節點是否被標記為黃色就可以知道它是否出現過了。
如果沒被標記,把這個節點標記為紅色,就相當於插入了這個單詞,這樣查找和插入就可以一起實現。
代碼實現:
void search(char s[]){//查找和插入 Trie *x=&root; for(int i=0;s[i];i++){ if(x->son[s[i]-‘a‘]==NULL){//判斷之前是否出現過 x->son[s[i]-‘a‘]=new Trie;//創建新的節點} x=x->son[s[i]-‘a‘]; } if(!x->w)sum++,x->w=1;//sum總結點數+1 }
因為空間是動態分配的,所以用完要釋放
void trie_free(Trie* x){//空間釋放 for(int i=0;i<26;i++){ if(x->son[i]!=NULL)trie_free(x->son[i]);//先釋放子節點 } delete x; }
trie樹(字典樹)