字典树
Trie 是一颗非典型的多叉树模型
每个节点分裂成对应26个字母的子节点,从上往下形成任一单词的前缀
下面来定义一个字典树的类
1. 属性
class Trie {
private:
bool isEnd;//是否为叶子节点
Trie* next[26];//26棵子树
public:
//方法将在下文实现...
};
2. 插入方法
void insert(string word) {
Trie* node = this;
for (char c : word) {//从左往右遍历每一个字母
if (node->next[c-'a'] == NULL) //没有节点的话,新建节点
node->next[c-'a'] = new Trie();
node = node->next[c-'a'];//进入下一节点
}
node->isEnd = true;//叶子节点标志,说明这个单词已插入
}
3. 查询方法
bool search(string word) {
Trie* node = this;
for (char c : word) {
node = node->next[c - 'a'];//往下遍历
if (node == NULL) {
return false;//这条分支没有打通
}
}
return node->isEnd;//将存在的结果返回
}
4. 前缀匹配方法
bool startsWith(string prefix) {
Trie* node = this;
for (char c : prefix) {
node = node->next[c-'a'];
if (node == NULL) {
return false;
}
}
return true;//有路径直接返回true
}
5. 整个类
class Trie {
private:
bool isEnd;
Trie* next[26];
public:
Trie() {
isEnd = false;
memset(next, 0, sizeof(next));
}
void insert(string word) {
Trie* node = this;
for (char c : word) {
if (node->next[c-'a'] == NULL) {
node->next[c-'a'] = new Trie();
}
node = node->next[c-'a'];
}
node->isEnd = true;
}
bool search(string word) {
Trie* node = this;
for (char c : word) {
node = node->next[c - 'a'];
if (node == NULL) {
return false;
}
}
return node->isEnd;
}
bool startsWith(string prefix) {
Trie* node = this;
for (char c : prefix) {
node = node->next[c-'a'];
if (node == NULL) {
return false;
}
}
return true;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本