简单介绍
字典树的实现有点类似编程题目的Huffman编码。构建一个树,把要记录的值作为边,然后记录该点是否是终点,可以用来字符串去重,快速查找字符串等。
具体原理可以参考:博客链接
源码实现
#include<iostream>
#include<bits/stdc++.h>
using namespace std;
/*构建一个字典树
实现插入操作
实现查询是否存在
可以实现字符串去重(大量字符串的时候
*/
const int MaxN = 26;//每个节点最多可以有的节点数量
struct node
{
node* next[MaxN];//用val作为下标
int num;//孩子节点的数量
char val;//到该节点的边
bool root;//是否是根结点
bool isEnd;//是否是终点
node()
{
root = false;
isEnd = false;
num = 0;
}
node(char c)
{
val = c;
isEnd = false;
root = false;
num = 0;
}
};
//判断节点是否有c这条边
bool check(node* root, char c)
{
if(root->next[c-'a'] != NULL)
return true;
return false;
}
//插入一个字符串
void Insert(node* &root, string s)
{
node* temp = root;
for(int i = 0; i < s.size(); i++)
{
//将字符串s的每一位加到树上
if(!check(temp, s[i]))
{
//新增节点
temp->next[s[i]-'a'] = new node(s[i]);
++temp->num;
}
temp = temp->next[s[i]-'a'];//从下一个节点开始找
}
//标记终点
temp->isEnd = true;
}
//是否包含字符串
bool isContian(node* root, string s)
{
for(int i = 0; i < s.size(); i++)
{
if(!check(root, s[i]))
return false;
root = root->next[s[i]-'a'];
}
return root->isEnd;
}
int main()
{
node* root = new node();
root->root = true;
/*
插入字符串构建字典树
去重
....
*/
Insert(root, "abcde");
Insert(root, "aaaa");
cout << isContian(root, "aaaa") << endl;
cout << isContian(root, "abcd") << endl;
return 0;
}