# 字典树

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;
}

• 本文已收录于以下专栏：

## 字典树数组实现

• u013588639
• 2014年08月06日 21:04
• 1572

## 《字典树》数组模版

#include #include using namespace std; const int N=1000005; int trie[N][26],cnt[N],flag[N],num; vo...
• a709743744
• 2016年01月26日 21:05
• 492

## 字典树（Trie树）用法及例子（一）

• u010902721
• 2015年05月15日 20:53
• 4313

## 字典树 c++ 实现

• rongdongzhu1
• 2015年09月13日 16:16
• 1053

## [算法系列之二十]字典树（Trie）

• SunnyYoona
• 2015年02月21日 22:26
• 4144

## 字典树的题目 找了个时间刷了一点字典树的题目

http://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2009/pid/2828 #includ...
• qq_33435265
• 2017年04月26日 09:24
• 241

## 01字典树 小结

• SolarDomo
• 2016年08月10日 10:15
• 1296

## 空间优化的字典树

(同步个人博客 http://sxysxy.org/blogs/29 到csdn)字典树空间优化如果字典树要储存的字符串的字符集比较大，(比如全部的字符)，甚至可能有多字节字符。这是我们给每个节点25...
• u013632138
• 2016年09月08日 18:40
• 244

## hdu2846（字典树好题）

• u013509299
• 2014年08月02日 22:54
• 673

## 字典树简介和简易应用

1、背景         词汇搜索、词频统计等字符串操作，是搜索引擎、文本处理系统等经常使用的业务，现在假设有这么一个简单的文本处理例子：有一篇10000个词的文章，要查出单词“was”在这篇文章中出...
• ly01kongjian
• 2013年03月31日 16:15
• 4022

举报原因： 您举报文章：字典树 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)