字典樹
阿新 • • 發佈:2017-07-04
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 }
字典樹