📅  最后修改于: 2023-12-03 15:12:44.294000             🧑  作者: Mango
这道题目要求我们实现一个 trie 树,并展示如何使用该 trie 树实现单词搜索。
Trie 树是一种数据结构,用于快速查找字符串(单词)集合中是否包含某个给定的字符串。trie 树的每个节点都是一个字符,从根节点到任意一个节点形成的字符串即为该节点所代表的字符序列。trie 树有以下特点:
下面简要介绍 trie 树的实现细节。
首先,我们需要定义 trie 树中一个节点的数据结构:
struct TrieNode {
bool isEndOfWord; // 标记是否为单词的结束
unordered_map<char, TrieNode*> children; // 子节点
};
插入操作将一个单词插入到 trie 树中。对于单词中的每个字符,从根节点开始依次访问它们对应的 trie 树节点,遇到节点不存在时就新建一个节点。最后将该单词标记为结束。
void insert(TrieNode* root, string word) {
TrieNode* node = root;
for (char c : word) {
if (node->children.find(c) == node->children.end()) {
node->children[c] = new TrieNode;
}
node = node->children[c];
}
node->isEndOfWord = true;
}
搜索操作将在 trie 树中搜索一个单词。对于单词中的每个字符,从根节点开始依次访问它们对应的 trie 树节点,遇到节点不存在时就返回 false。最后检查最后访问的节点是否标记为单词的结束。
bool search(TrieNode* root, string word) {
TrieNode* node = root;
for (char c : word) {
if (node->children.find(c) == node->children.end()) {
return false;
}
node = node->children[c];
}
return node->isEndOfWord;
}
下面是完整代码:
#include <iostream>
#include <unordered_map>
using namespace std;
struct TrieNode {
bool isEndOfWord;
unordered_map<char, TrieNode*> children;
};
void insert(TrieNode* root, string word) {
TrieNode* node = root;
for (char c : word) {
if (node->children.find(c) == node->children.end()) {
node->children[c] = new TrieNode;
}
node = node->children[c];
}
node->isEndOfWord = true;
}
bool search(TrieNode* root, string word) {
TrieNode* node = root;
for (char c : word) {
if (node->children.find(c) == node->children.end()) {
return false;
}
node = node->children[c];
}
return node->isEndOfWord;
}
int main() {
TrieNode* root = new TrieNode;
insert(root, "hello");
insert(root, "world");
insert(root, "trie");
cout << search(root, "hello") << endl; // 输出 1
cout << search(root, "world") << endl; // 输出 1
cout << search(root, "trie") << endl; // 输出 1
cout << search(root, "he") << endl; // 输出 0
cout << search(root, "wor") << endl; // 输出 0
cout << search(root, "tried") << endl; // 输出 0
return 0;
}
以上就是 trie 树及其实现的详细介绍。使用 trie 树可以有效地解决单词搜索等类似问题,其时间复杂度为 $O(m)$,其中 $m$ 为单词长度。