1. 程式人生 > >字典樹

字典樹

http 字符串前綴 src 變量 als str trie 指針 roo

字典樹可以用來快速查找字符串前綴

技術分享

a.b.e.h匯聚於一點,該點為根節點。從根節點開始,每遇到一個紅點就可以組成一個單詞(相當於紅點被標記)。

節點的建立:

 1 struct Nod{
 2      bool is; //bool為布爾型變量,只有真假
 3      Nod *next[26]; //有26個字母
 4      Nod(){
 5          is = false;
 6          for(int i = 0; i < 26; i ++){
 7              next[i] = NULL; //節點所指的位置為空指針
 8          }
9 } 10 };

插入

1 void mkTrie(Nod *root,char *s){
2      Nod*p = root;
3      for(int i = 0; s[i]; i ++){
4          int a = s[i] - 0; //a為0
5          if(p->next[a]==NULL)p->next[a] = new Nod; //如果a所指的位置下面沒有子節點,則在a下面創建一個新的子節點
6          p = p->next[a]; //創建新節點
7      }
8      p->is = true
; //表示標記了單詞中最後一個字母,可以組成一個單詞 9 }

刪除:很多題目有很多組數據,如果不刪除釋放空間的話,很容易導致Memory Limit Exceeded(內存超限)

 1 void deleTrie(Nod *p){
 2      if(p == NULL) return;
 3      for(int i = 0; i < 26; i ++){
 4          if(p->next[i] != NULL){
 5              deleTrie(p->next[i]);
 6          } //循環查找從0到25的字母,若字母的子節點不為零,則繼續向下查找,直到找到被標記即為紅點的字母,從而刪除紅點字母,此時循環向上查找,以此類推從而刪除所有字母
7 } 8 free(p); 9 return ; 10 }

查找

1 int find(){
2      Nod* p = &t;
3      for(int i = 0; s[i]; i ++){
4          int a = s[i]-a;
5          if(p->next[a]==NULL) return 0;
6          p = p->next[a];
7      }
8      return p->num; //若找到的字母的子節點為零則返回零,否則,繼續尋找直到找到被標記的字母
9  }

字典樹