21xrx.com
2024-12-23 01:09:59 Monday
登录
文章检索 我的文章 写文章
C++ 实现基数树
2023-06-29 17:29:15 深夜i     --     --
C++ 基数树 数据结构 算法 搜索树

基数树(Radix Tree),也叫做字典树(Trie Tree),是一种用于数据的检索和存储的树状数据结构。基数树是一种高效的检索方式,适用于处理字符串数据。

C++ 是一种广泛使用的编程语言,非常适用于实现基数树。本文将介绍如何使用 C++ 实现基数树。

1. 基数树的定义

基数树是一种树状数据结构,树的节点代表了一个字符串的前缀。从根节点开始,以每个字符为边,逐步向下延伸,直到到达一个叶子节点。如果一个字符串在基数树中被存储,那么从根节点到叶子节点的路径就是这个字符串。

2. 基数树的实现

基数树的实现需要使用指针和动态内存分配。下面是一个基数树节点的数据结构定义:

struct TrieNode {

  char val; // 节点存储的字符

  bool is_word; // 标记该节点是否存储了一个单词

  TrieNode* children[26]; // 该节点的子节点,长度为 26

};

3. 插入操作

为了将一个字符串插入基数树中,我们需要从根节点开始,按照字符串的每个字符向下延伸。如果延伸到的节点不存在,就需要新建一个节点并将其插入到树中。最后,在字符串的最后一个字符处,标记所在节点存储了一个单词。

void insert(TrieNode* root, string word) {

  TrieNode* node = root;

  for(char c : word) {

    if(node->children[c-'a'] == nullptr) {

      node->children[c-'a'] = new TrieNode{c, false, {nullptr}};

    }

    node = node->children[c-'a'];

  }

  node->is_word = true;

}

4. 查找操作

为了查找一个字符串是否在基数树中,我们需要从根节点开始,按照字符串的每个字符向下延伸。如果延伸到的节点不存在,就说明这个字符串没有在树中。如果延伸到的节点标记了存储了一个单词,就说明这个字符串在树中。

bool search(TrieNode* root, string word) {

  TrieNode* node = root;

  for(char c : word) {

    if(node->children[c-'a'] == nullptr)

      return false;

    node = node->children[c-'a'];

  }

  return node->is_word;

}

5. 删除操作

为了删除基数树中的一个字符串,我们首先需要判断该字符串是否在树中。接着,从根节点开始,按照字符串的每个字符向下延伸,直到延伸到字符串的最后一个字符所在的节点。然后,我们需要标记该节点不再存储一个单词,并判断其是否可以被删除。如果该节点没有任何子节点,就可以将其删除。

bool remove(TrieNode* root, string word, int i) {

  if(i == word.size()) {

    root->is_word = false;

    for(int j = 0; j < 26; ++j) {

      if(root->children[j] != nullptr)

        return false;

    }

    delete root;

    return true;

  } else {

    char c = word[i];

    if(root->children[c-'a'] == nullptr)

      return false;

     else {

      if(remove(root->children[c-'a'], word, i+1)) {

        root->children[c-'a'] = nullptr;

        for(int j = 0; j < 26; ++j) {

          if(root->children[j] != nullptr)

            return false;

        }

        delete root;

        return true;

      }

      return false;

    }

  }

}

6. 总结

基数树是一种非常高效的处理字符串数据的数据结构,它可以用于字典的查找、前缀匹配、拼写检查等应用场景。本文介绍了如何使用 C++ 实现基数树以及插入、查找、删除操作。读者可以根据自己的需要进行修改和扩展。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复