trie,又称前缀树或字典樹,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。
一个保存了 8 个键的 trie 结构,"A", "to", "tea", "ted", "ten", "i", "in", and "inn".
In the example shown, keys are listed in the nodes and values below them. Each complete English word has an arbitrary integer value associated with it. A trie can be seen as adeterministic finite automaton, although the symbol on each edge is often implicit in the order of the branches.
It is not necessary for keys to be explicitly stored in nodes. (In the figure, words are shown only to illustrate how the trie works.)
Though tries are most commonly keyed by character strings, they don't need to be. The same algorithms can easily be adapted to serve similar functions of ordered lists of any construct, e.g., permutations on a list of digits or shapes. In particular, a bitwise trie is keyed on the individual bits making up a short, fixed size of bits such as an integer number or memory address.
A trie can also be used to replace a hash table, over which it has the following advantages:
Tries do have some drawbacks as well:
1 #include<stdio.h> 2 #include<conio.h> 3 #include<stdlib.h> 4 #include<string.h> 5 6 typedef struct trie trie; 7 struct trie 8 { 9 char key; 10 trie *next,*children; 11 }; 12 13 trie *newnode(char s) 14 { 15 trie *t=(trie *)malloc(sizeof(trie)); 16 t->key=s; 17 t->next=t->children=NULL; 18 } 19 20 void insert(trie **t,char *s,int start) 21 {if(s[start]=='\0') 22 { 23 *t=newnode('#'); 24 return; 25 } 26 if(*t==NULL) 27 { 28 *t=newnode(s[start]); 29 insert(&(*t)->children,s,start+1); 30 } 31 if((*t)->key==s[start]) 32 insert(&(*t)->children,s,start+1); 33 else 34 insert(&(*t)->next,s,start); 35 } 36 37 38 bool search(trie *t ,char *s,int start) 39 { 40 41 42 if(t==NULL) 43 return false; 44 45 if(t->key=='#' && s[start]=='\0') 46 return true; 47 48 if(t->key!='#' && s[start]=='\0' || t->key=='#' && s[start]!='\0') 49 return false; 50 51 if(t->key==s[start]) 52 return search(t->children,s,start+1); 53 54 else 55 return search(t->next,s,start); 56 57 return false; 58 } 59 60 /*void push(trie **t ,char *str) 61 { int i=0; 62 for(i=0;i<strlen(str);i++) 63 insert(t,str[i]); 64 }*/ 65 66 main() 67 { int i=0; 68 69 trie *t=NULL; 70 char ch='y'; 71 while(ch=='y') 72 { 73 {char str[20]; 74 fflush(stdin); 75 printf("Enter the word "); 76 gets(str); 77 78 79 insert(&t,str,0); 80 } 81 // push(&t,str); 82 fflush(stdin); 83 printf("more y/n ::"); 84 ch=getchar(); 85 } 86 87 ch='y'; 88 while(ch=='y') 89 {char str[20]; 90 fflush(stdin); 91 printf("Enter the string you want to search::"); 92 gets(str); 93 94 fflush(stdin); 95 if(search(t,str,0)) 96 printf("Found"); 97 else 98 printf("Not Found"); 99 100 printf("\n more y/n ::"); 101 scanf("%c",&ch); 102 103 } 104 105 getch(); 106 107 }