题目:
编写Trie树基本操作,包括插入,搜索,销毁
分析:
字典树,就是一棵26叉树(不考虑树的字符的大小写问题),在每个节点中加入计数器,表示从根节点到达当前节点的字符流表示一个字符串,代码如下:
#include <iostream>
#include <cstdio>
using namespace std;
#define ELEMENT_MAX 26
typedef struct trie_node
{
int count;
struct trie_node * next[ELEMENT_MAX];
}*pTrie;
int err = 0;
bool insertTrie(pTrie root, const char * str)
{
if(root == NULL || str == NULL)
{
return false;
}
pTrie p = root;
while(*str != '\0')
{
if(p->next[*str - 'a'] == NULL)
{
p->next[*str - 'a'] = (pTrie)malloc(sizeof(struct trie_node));
if(p->next[*str - 'a'] == NULL)
{
return false;
}
p->next[*str - 'a']->count = 0; //一定要进行初始化操作
for(int i = 0; i < ELEMENT_MAX; i++)
p->next[*str - 'a']->next[i] = NULL;
}
p = p->next[*str - 'a'];
str++;
}
p->count++;
return true;
}
bool searchTrie(pTrie root, const char * str)
{
if(root == NULL || str == NULL)
{
return false;
}
pTrie p = root;
while(*str != '\0')
{
if(p->next[*str - 'a'] == NULL)
return false;
else
{
p = p->next[*str - 'a'];
str++;
}
}
if(p->count > 0)
return true;
return false;
}
void deleteTrie(pTrie root)
{
if(root == NULL) //必须首先判定是否为NULL
return ;
for(int i = 0; i < ELEMENT_MAX; i++)
{
deleteTrie(root->next[i]);
}
free(root);
return ;
}
int main()
{
char str[20];
pTrie root = (pTrie)malloc(sizeof(struct trie_node));
root->count = 0;
for(int i = 0; i < ELEMENT_MAX; i++)
root->next[i] = NULL;
printf("Input the number of str: \n");
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%s", str);
insertTrie(root,str);
}
printf("Input the search str: \n");
while(scanf("%s", str) != EOF)
cout << searchTrie(root, str) << endl;
deleteTrie(root);
return 0;
}
总结:
字典树出现的频率比较高,通过使用字典树,可以对大量字符串进行高效查找。