📜  门| GATE-CS-2017(套装1)|问题 9(1)

📅  最后修改于: 2023-12-03 15:12:44.294000             🧑  作者: Mango

门| GATE-CS-2017(套装1)|问题 9

这道题目要求我们实现一个 trie 树,并展示如何使用该 trie 树实现单词搜索。

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$ 为单词长度。