#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 26
typedef struct TrieNode //trie的数据结构定义
{
int v; // 该节点作为前缀出现的次数
struct TrieNode *next[MAX]; //next为指向结构体自身的一个空指针数组,用来存放下一节点的地址 //空指针数组可以存放任何数的地址。
} Trie;
Trie *root;
//构建字典树
void createTrie(char * str)
{
int len=strlen(str);
root=(Trie *)malloc(sizeof(Trie));
for(int i=0;i<MAX;i++)
root->next[i]=NULL;
Trie *p=root,*q;
for(int i=0;i<len;i++)
{
int id = str[i] - 'a'; //当前字符应该插入的位置
if (p->next[id]==NULL) //没有节点,则开辟一个新的节点
{
q=(Trie *)malloc(sizeof(Trie));
q->v =1; //则该节点作为前缀的次数为1
for(int i = 0; i < MAX; i++)
q->next[i] = NULL; //新建节点的地址为0
p->next[id]=q;
p=q;
}
else
{ p=p->next[id];
p->v++;
}
}
}
//搜索字典树
int searchTrie(char * str)
{
Trie *p =root;
int len=strlen(str);
for(int i=0;i<len;i++) //如果这个字母存在
{
int id = str[i] - 'a'; //确定这个字母的位置
if(p->next[id]==NULL)
return 0;
p->next[id];
}
return p->v; //返回最后的那个字符 所在节点的n,即搜索字符串作为前缀出现的次数
}
trie树动态分配内存模板
原文作者:Trie树
原文地址: https://blog.csdn.net/qq_28124713/article/details/50528248
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
原文地址: https://blog.csdn.net/qq_28124713/article/details/50528248
本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。