Trie树

Trie总结

概念:Trie,又称单词查找树键树,是一种形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。

Trie树

在这个Trie结构中,保存了A、to、tea、ted、ten、i、in、inn这8个字符串(有数字的代表单词)

个人理解:Trie树就是将每个单词用树形进行存储,当有几个单词有一样的前缀的时候,可有几天支是相同的

View Code
 1 #include<iostream>

 2 #include<string.h>

 3 #include<stdlib.h>

 4 #include<stdio.h>

 5 using namespace std;

 6 #define MAX 26//这是代表26个字母,如果包含数字需要重新定义

 7 

 8 struct Trie

 9 {

10     Trie *next[MAX];

11     int v;//v可以表示一个字典树到此有多少相同前缀的数目,这里根据需要应当学会自由变化。

12 };

13 Trie *root;

14 

15 void creatTrie(char *str)//创建结点,并且插入单词

16 {

17     int len=strlen(str);

18     Trie *p=root,*q;

19     for (int i=0; i<len; i++)

20     {

21         int id=str[i]-'0';

22         if(p->next[id]==NULL)//如果该字母的下一个点为空,则可以插入新

23         {

24             q=(Trie *)malloc(sizeof(Trie));

25             q->v=1;

26             for (int j=0; j<MAX; j++) q->next[j]=NULL;

27             p->next[id]=q;

28             p=p->next[id];

29         }

30         else  //若该结点的下一个字母已经在下一个结点中了

31         {

32             p->next[id]->v++;//跳过下一个到下下个

33             p=p->next[id];

34         }

35     }

36     p->v=-1;//该单词插入完毕,封结点

37 }

38 int findTrie(char *str)

39 {

40     int len=strlen(str);

41     Trie *p=root;

42     for (int i=0; i<len; i++)

43     {

44         int id=str[i]-'0';

45         p=p->next[id];

46         if(p==NULL) return 0;//若为空集,表示不存以此为前缀的串

47         if(p->v==-1) return -1;////字符集中已有串是此串的前缀

48     }

49     return -1;////此串是字符集中某串的前缀

50 } //比如911为窜已存储,输入9133判断911是不是他的前窜 //当911到达第二个1的时候,p->next[id](2)=NULL

51 

52 int dealTrie(Trie *T)//删除树

53 {

54     int i;

55     if(T==NULL) return 0;

56     for (i=0; i<MAX; i++)

57     {

58         if(T->next[i]!=NULL) dealTrie(T->next[i]);

59     }

60     free(T);

61     return 0;

62 }

63 int main()

64 {

65     int T;

66     char str[100];

67     scanf("%d",&T);

68     while(T--)

69     {

70         int n,i;

71         int flag=0;

72         root=(Trie *)malloc(sizeof(Trie));//刚开始需要建立结点

73         for (i=0; i<MAX; i++) root->next[i]=NULL;

74         scanf("%d",&n);

75         scanf("%s",str);

76         creatTrie(str);

77         for (i=1; i<n; i++)

78         {

79             scanf("%s",str);

80             if(flag) continue;

81             if(findTrie(str)==-1) flag=1;

82             else creatTrie(str);

83         }

84         if(flag) printf("NO\n");

85         else printf("YES\n");

86         dealTrie(root);

87     }

88 }

 

你可能感兴趣的:(trie)