当前位置:   article > 正文

Trie树(字典树)_字典树(trie tree)

字典树(trie tree)

trie树,又称字典树或前缀树,是一种有序 的、用于统计、排序和存储字符串的数据 结构,它与二叉查找树不同,关键字不是 直接保存在节点中,而是由节点在树中的 位置决定。 一个节点的所有子孙都有相同的前缀,也 就是这个节点对应的字符串,而根节点对 应空字符串。一般情况下,不是所有的节点 都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 trie树的最大优点就是利用字符串的公共前 缀来减少存储空间与查询时间,从而最大 限度地减少无谓的字符串比较,是非常高 效的字符串查找数据结构。

深度遍历

深度搜索trie树,对于正在搜索的节点node: 遍历该节点的26个孩子指针child[i]('a'-'z'),如果指针不空:

将该child[i]对应的字符(i+’a’),push进入栈中, 如果该孩子指针标记的is_end为真(说明这个位置是一个单词):

从栈底到栈顶对栈进行遍历,生成字符串,将它保存到结果数组中 深度搜索child[i]

弹出栈顶字符

Trie树的单词插入

Trie树的单词搜索

  1. #include <iostream>
  2. #include<vector>
  3. #define TRIE_MAX_CHAR_NUM 26
  4. struct TrieNode{
  5. struct TrieNode * child[TRIE_MAX_CHAR_NUM];
  6. bool is_end;
  7. TrieNode() : is_end(false){
  8. for(int i=0;i< TRIE_MAX_CHAR_NUM;i++){
  9. child[i] = 0;
  10. }
  11. }
  12. };
  13. class TrieTree{
  14. public:
  15. TrieTree(){
  16. }
  17. ~TrieTree(){//定义析构函数
  18. for(int i=0;i<_node_vec.size();i++){
  19. delete _node_vec[i];
  20. }
  21. }
  22. void insert(const char *word){
  23. TrieNode *ptr = &_root;
  24. while(*word){
  25. int pos = *word - 'a';
  26. if(!ptr->child[pos]){
  27. ptr->child[pos] = new_node();
  28. }
  29. ptr = ptr->child[pos];
  30. word++;
  31. }
  32. ptr->is_end = true;
  33. }
  34. bool startsWith(const char *prefix){
  35. TrieNode *ptr = &_root;
  36. while(*prefix){
  37. int pos = *prefix - 'a';
  38. if(!ptr->child[pos]){
  39. return false;
  40. }
  41. ptr = ptr->child[pos];
  42. prefix++;
  43. }
  44. return true;
  45. }
  46. bool search(const char *word){
  47. TrieNode *ptr = &_root;
  48. while(*word){
  49. int pos = *word - 'a';
  50. if(!ptr -> child[pos]){
  51. return false;
  52. }
  53. ptr = ptr->child[pos];
  54. word++;
  55. }
  56. return ptr->is_end;
  57. }
  58. TrieNode *root(){
  59. return &_root;
  60. }
  61. private:
  62. TrieNode *new_node(){
  63. TrieNode *node = new TrieNode();
  64. _node_vec.push_back(node);
  65. return node;
  66. }
  67. std::vector<TrieNode *> _node_vec;
  68. TrieNode _root;
  69. };
  70. void preorder_trie(TrieNode *node,int layer){
  71. for(int i=0;i<TRIE_MAX_CHAR_NUM;i++){
  72. if(node->child[i]){
  73. for(int j=0;j<layer;j++){
  74. printf("---");
  75. }
  76. printf("%c",i+'a');
  77. if(node->child[i]->is_end){
  78. printf("(end)");
  79. }
  80. printf("\n");
  81. preorder_trie(node->child[i],layer+1);
  82. }
  83. }
  84. }
  85. void get_all_word_from_trie(TrieNode *node,std::string &word,
  86. std::vector<std::string> &word_list){
  87. for(int i=0;i<TRIE_MAX_CHAR_NUM;i++){
  88. if(node->child[i]){
  89. word.push_back(i+'a');//将字符入栈
  90. if(node->child[i]->is_end){
  91. word_list.push_back(word);
  92. }
  93. get_all_word_from_trie(node->child[i],word,word_list);
  94. word.erase(word.length()-1,1);//弹出栈顶字符
  95. }
  96. }
  97. }
  98. int main(int argc, const char * argv[]) {
  99. TrieTree trie_tree;
  100. trie_tree.insert("abcd");
  101. trie_tree.insert("abc");
  102. trie_tree.insert("abd");
  103. trie_tree.insert("b");
  104. trie_tree.insert("bcd");
  105. trie_tree.insert("efg");
  106. preorder_trie(trie_tree.root(), 0);
  107. printf("\n");
  108. std::vector<std::string> word_list;
  109. std::string word;
  110. printf("All words:\n");
  111. get_all_word_from_trie(trie_tree.root(),word,word_list);
  112. for(int i=0;i<word_list.size();i++){
  113. printf("%s\n",word_list[i].c_str());
  114. }
  115. printf("\n");
  116. printf("Search:\n");
  117. printf("abc:%d\n",trie_tree.search("abc"));
  118. printf("abcd:%d\n",trie_tree.search("abcd"));
  119. printf("bc:%d\n",trie_tree.search("bc"));
  120. printf("b:%d\n",trie_tree.search("b"));
  121. printf("\n");
  122. printf("ab:%d\n",trie_tree.startsWith("ab"));
  123. printf("abc:%d\n",trie_tree.startsWith("abc"));
  124. printf("bc:%d\n",trie_tree.startsWith("bc"));
  125. printf("fg:%d\n",trie_tree.startsWith("fg"));
  126. return 0;
  127. }

输出:

  1. a
  2. ---b
  3. ------c(end)
  4. ---------d(end)
  5. ------d(end)
  6. b(end)
  7. ---c
  8. ------d(end)
  9. e
  10. ---f
  11. ------g(end)
  12. All words:
  13. abc
  14. abcd
  15. abd
  16. b
  17. bcd
  18. efg
  19. Search:
  20. abc:1
  21. abcd:1
  22. bc:0
  23. b:1
  24. ab:1
  25. abc:1
  26. bc:1
  27. fg:0
  28. Program ended with exit code: 0

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/秋刀鱼在做梦/article/detail/994794
推荐阅读
相关标签
  

闽ICP备14008679号