Trie树的应用场景
- 高效地存储和查找字符串集合地数据结构
Trie树的思想
思想见下面的例子,显而易见,就不用文字描述了
一个Trie树的例子
核心代码
- Trie树的存储
const int N = 1e5 + 10;
int son[N][26]; // 其中存放的是:子节点对应的idx。其中son数组的第一维是:父节点对应的idx,第第二维计数是:其直接子节点('a' - '0')的值为二维下标。
int cnt [N]; // cnt数组记录对应字符串出现的次数
int idx; // 将该字符串分配的一个树结构中,以下标来记录每一个字符的位置。方便之后的插入和查找。
char str[N];
- 插入代码
void insert(char str[])
{
int p = 0;
for (int i = 0; str[i]; ++i)
{
int u = str[i] - 'a';
// 如果p点不存在u这个子节点则创建
if (!son[p][u]) son[p][u] = ++idx;
// 令p等于trie树的叶节点对应的位置
p = son[p][u];
}
++cnt[p];
}
- 查询代码
int query(char str[])
{
int p = 0;
for (int i = 0; str[i]; ++i)
{
int u = str[i] - 'a';
if (!son[p][u]) return 0;
p = son[p][u];
}
// 返回单次数量
return cnt[p];
}