字典树
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;
}
};