# 字典树

439人阅读 评论(0)

http://www.cnblogs.com/DiaoCow/archive/2010/04/19/1715337.html

#define  MAX    26 //字符集大小

typedef
struct TrieNode
{

int nCount; //记录该字符出现次数
struct TrieNode *next[MAX];
}TrieNode;

TrieNode Memory[
1000000];
int allocp = 0;

/*初始化*/
void InitTrieRoot(TrieNode **pRoot)
{

*pRoot = NULL;
}

/*创建新结点*/
TrieNode
*CreateTrieNode()
{

int i;
TrieNode
*p;

p
= &Memory[allocp++];
p
->nCount = 1;

for(i = 0 ; i < MAX ; i++)
{
p
->next[i] = NULL;
}

return p;
}

/*插入*/
void InsertTrie(TrieNode **pRoot , char *s)
{

int i , k;
TrieNode
*p;

if(!(p = *pRoot))
{
p
= *pRoot = CreateTrieNode();
}
i
= 0;

while(s[i])
{
k
= s[i++] - 'a'; //确定branch
if(p->next[k])
p
->next[k]->nCount++;

else
p
->next[k] = CreateTrieNode();
p
= p->next[k];
}
}

//查找
int SearchTrie(TrieNode **pRoot , char *s)
{
TrieNode
*p;

int i , k;

if(!(p = *pRoot))
{

return 0;
}
i
= 0;

while(s[i])
{
k
= s[i++] - 'a';

if(p->next[k] == NULL)    return 0;
p
= p->next[k];
}

return p->nCount;
}

1.统计难题(这里都用数组分配结点，用malloc分配太慢了）

#include <stdio.h>
#define  MAX    26

typedef
struct TrieNode
{

int nCount;

struct TrieNode *next[MAX];
}TrieNode;

TrieNode Memory[
1000000];
int allocp = 0;

void InitTrieRoot(TrieNode **pRoot)
{

*pRoot = NULL;
}

TrieNode
*CreateTrieNode()
{

int i;
TrieNode
*p;

p
= &Memory[allocp++];
p
->nCount = 1;

for(i = 0 ; i < MAX ; i++)
{
p
->next[i] = NULL;
}

return p;
}

void InsertTrie(TrieNode **pRoot , char *s)
{

int i , k;
TrieNode
*p;

if(!(p = *pRoot))
{
p
= *pRoot = CreateTrieNode();
}
i
= 0;

while(s[i])
{
k
= s[i++] - 'a'; //确定branch
if(p->next[k])
p
->next[k]->nCount++;

else
p
->next[k] = CreateTrieNode();
p
= p->next[k];
}
}

int SearchTrie(TrieNode **pRoot , char *s)
{
TrieNode
*p;

int i , k;

if(!(p = *pRoot))
{

return 0;
}
i
= 0;

while(s[i])
{
k
= s[i++] - 'a';

if(p->next[k] == NULL)    return 0;
p
= p->next[k];
}

return p->nCount;
}

int main(void)
{

char s[11];

TrieNode
*Root = NULL;
InitTrieRoot(
&Root);

while(gets(s) && s[0])
{
InsertTrie(
&Root , s);
}

while(gets(s))
{
printf(
"%d/n", SearchTrie(&Root , s));
}

2.Phone List

return    0;
}

#include <stdio.h>
#define  MAX    10

typedef
struct TrieNode
{

int nEndFlag; //标记该字符是否是某一字符串的结尾
struct TrieNode *next[MAX];
}TrieNode;

TrieNode Memory[
1000000];
int allocp = 0 , nFlag = 0;

void InitTrieRoot(TrieNode **pRoot)
{

*pRoot = NULL;
}

TrieNode
*CreateTrieNode()
{

int i;
TrieNode
*p;

p
= &Memory[allocp++];
p
->nEndFlag = 0;

for(i = 0 ; i < MAX ; i++)
{
p
->next[i] = NULL;
}

return p;
}

void InsertTrie(TrieNode **pRoot , char *s)
{

int i , k;
TrieNode
*p;

if(!(p = *pRoot))
{
p
= *pRoot = CreateTrieNode();
}
i
= 0;

while(s[i])
{
k
= s[i++] - '0';

if(p->next[k])
{

if(p->next[k]->nEndFlag == 1 || s[i] == '/0') //先短后长 || 先长后短
{
nFlag
= 1;

return;
}
}

else
{
p
->next[k] = CreateTrieNode();
}
p
= p->next[k];
}
p
->nEndFlag = 1//标记结尾
}

int main(void)
{

int  z , n , i;

char s[11];
TrieNode
*Root;

scanf(
"%d", &z);

while(z-- > 0
{
nFlag
= allocp = 0;
InitTrieRoot(
&Root);
scanf(
"%d" , &n);    getchar();

for(i = 0 ; i < n ; i++)
{
gets(s);

if(!nFlag)    InsertTrie(&Root , s);
}
nFlag
? printf("NO/n") : printf("YES/n");
}

return    0;
}

0
0

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
个人资料
• 访问：239714次
• 积分：3301
• 等级：
• 排名：第10281名
• 原创：84篇
• 转载：50篇
• 译文：0篇
• 评论：24条
评论排行
最新评论