trie 树
字典树是一种用于实现字符串快速检索的多叉树结构
trie 的每个节点都拥有若干个字符指针,若在插入或检索字符串时扫描到一个字符 c c c
就沿着当前节点的 c c c 字符指针,走向该指针指向的节点
实现
(1) 初始化
一颗空 trie 仅包含一个根节点,该字符的指针均指向空
(2) 插入
当需要插入一个字符串 s s s 时,我们令一个指针 P P P 起初指向根节点。然后依次扫描 s s s 中的每一个字符 c c c
-
1.若 P P P 的 c c c 字符指针指向一个已经存在的节点 Q Q Q ,则令 P = Q P=Q P=Q
-
2.若 P P P 的 c c c 字符指针指向空,则新建一个节点 Q Q Q 令 P P P 的 c c c 字符指针指向 Q Q Q ,然后令 P = Q P=Q P=Q
-
当 S S S 中的字符扫描完毕,在当前节点 P P P 上标记它是一个字符串的末尾
(3) 检索
当需要检索一个字符串 S S S 在 T r i e Trie Trie 中是否存在时,我们令一个指针 P P P 起初指向根节点,然后依次扫描 S S S 中的每个字符 c c c
-
(1) 若 P P P 的 c c c 字符指针指向空,则说明 S S S 没有被插入到 T r i e Trie Trie 树中,结束检索
-
(2) 若 P P P 的 c c c 字符指针指向一个已经存在的节点 Q Q Q ,则令 P = Q P=Q P=Q
当 S S S 中的字符扫描完毕
若在当前节点 P P P 被标记为一个 字符串的末尾,则说明 S 在 Trie 树中存在,否则说明 S 没有被插入过
#include<bits/stdc++.h>
using namespace std;
int trie[ ][ ],tot=1;
char str[ ];
bool end[ ];
void put()
{
//1
int len;
//2
int p=1;
//3
for(int i=1;i<=len;i++)
{
int ch=str[i]-'a';
trie[p][ch]
//(1)指向空
trie[p][ch]=++tot;
//(2)指向已存在
p=trie[p][ch];
}
//4
end[p]=true;
return;
}
bool find()
{
//1
int len;
//2
int p=1;
//3
for(int i=1;i<=len;i++)
{
int ch=str[i]-'a';
trie[p][ch]
//(1)指向空
return false;
//(2)指向已存在
p=trie[p][ch];
}
//4
return end[p];
}
int main(){
return 0;
}