字典树是哈希树的变种, 它采用公用前缀的方式来提高效率, 刚开始以为公用前缀, 空间会节省, 后来想想, 空间也不是节省, 因为每一个都有26个指针(这里假设都是小写字母的话), 不过他的时间复杂度是常数级的, 效率非常高, O(1)的复杂度, 它是典型的空间换时间, 他常用的功能是增删查, 其实删除并不算太常用, 增加和查找用的比较多点.具体的实现代码如下:

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. //结构体里面可以灵活的加一些东西,根据功能来加
  5. typedef struct Node{
  6. int isWord;//标记是否到这里是个单词
  7. struct Node *next[];//26个子孩子,
  8. }Node, *PNode;
  9.  
  10. void add_word(PNode *root, char *word)//将指定单词添加到字典树
  11. {
  12. PNode node;
  13. int len = strlen(word);
  14. int i = ;
  15. PNode ptr = *root;
  16. while(i < len)
  17. {
  18. if(ptr->next[word[i] - 'a'] == NULL)
  19. {
  20. node = (PNode)malloc(sizeof(Node));
  21. for(int j = ; j < ; j++)
  22. {
  23. node->isWord = ;
  24. node->next[j] = NULL;
  25. }
  26. ptr->next[word[i] - 'a'] = node;
  27. }
  28. ptr = ptr->next[word[i] - 'a'];
  29. i++;
  30. }
  31. ptr->isWord = ;//最后标记这个点是单词的结尾
  32. }
  33.  
  34. void search_word(PNode root, char *word)//查找单词,递归方式
  35. {
  36. if(word[] != '\0' && root->next[word[] - 'a'] == NULL)
  37. {
  38. printf("No this word\n");
  39. return;
  40. }
  41. if(word[] == '\0')
  42. {
  43. if(root == NULL)
  44. printf("exist!\n");
  45. else
  46. {
  47. if(root->isWord == )
  48. printf("exist!\n");
  49. else
  50. printf("No this word\n");
  51. }
  52. return;
  53. }
  54. search_word(root->next[word[] - 'a'], word + );
  55. }
  56. //查找单词,非递归方式
  57. int search_words(PNode root, char *word)
  58. {
  59. int len = strlen(word);
  60. int i = ;
  61. PNode ptr = root;
  62. while(i < len)
  63. {
  64. if(ptr->next[word[i] - 'a'] == NULL)
  65. return ;
  66. ptr = ptr->next[word[i] - 'a'];
  67. i++;
  68. }
  69. if(ptr->isWord == )
  70. return ;
  71. return ;
  72. }
  73. //删除指定的单词,这里只是将它的标记设为0, 并没有真正意义上的删除
  74. void delete_word(PNode *root, char *word)
  75. {
  76. if(word[] == '\0' && (*root) != NULL)
  77. {
  78. (*root)->isWord = ;
  79. return;
  80. }
  81. if((*root) == NULL)
  82. {
  83. printf("No this word\n");
  84. return;
  85. }
  86. delete_word(&(*root)->next[word[] - 'a'], word + );
  87. }
  88. //删除整个字典树,真正的删除
  89. //如果要在函数里面调用此函数的时候,调用完之后如果还想创建树,要重新malloc根节点
  90. void delete_all(PNode root)
  91. {
  92. for(int i = ; i < ; i++)
  93. {
  94. if(root->next[i] != NULL)
  95. delete_all(root->next[i]);
  96. }
  97. free(root);
  98. }
  99.  
  100. int main()
  101. {
  102. int choice;
  103. char str[];
  104. PNode root = (PNode)malloc(sizeof(Node));
  105. root->isWord = ;
  106. for(int i = ; i < ; i++)
  107. root->next[i] = NULL;
  108. do{
  109. //测试菜单
  110. printf("1. add word 2. search word 3. delete word 0. exit\n");
  111. scanf("%d", &choice);
  112. switch(choice)
  113. {
  114. case :
  115. scanf("%s", str);
  116. add_word(&root, str);
  117. break;
  118. case :
  119. scanf("%s", str);
  120. if(search_words(root, str) == )
  121. printf("exist\n");
  122. else
  123. printf("not found\n");
  124. //当然也可以用递归的那个
  125. // search_word(root, str);
  126. break;
  127. case :
  128. scanf("%s", str);
  129. delete_word(&root, str);
  130. default:
  131. break;
  132. }
  133. }while(choice != );
  134. delete_all(root);
  135. return ;
  136. }

Trie 字典树的更多相关文章

  1. 萌新笔记——C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  2. Trie字典树 动态内存

    Trie字典树 #include "stdio.h" #include "iostream" #include "malloc.h" #in ...

  3. 算法导论:Trie字典树

    1. 概述 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树. Trie一词来自retrieve,发音为/tr ...

  4. 标准Trie字典树学习二:Java实现方式之一

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! 系列文章: 1. 标准Trie字典树学习一:原理解析 2.标准T ...

  5. 817E. Choosing The Commander trie字典树

    LINK 题意:现有3种操作 加入一个值,删除一个值,询问pi^x<k的个数 思路:很像以前lightoj上写过的01异或的字典树,用字典树维护数求异或值即可 /** @Date : 2017- ...

  6. C++里创建 Trie字典树(中文词典)(一)(插入、遍历)

    萌新做词典第一篇,做得不好,还请指正,谢谢大佬! 写了一个词典,用到了Trie字典树. 写这个词典的目的,一个是为了压缩一些数据,另一个是为了尝试搜索提示,就像在谷歌搜索的时候,打出某个关键字,会提示 ...

  7. 数据结构 -- Trie字典树

    简介 字典树:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种. 优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高. 性质:   1.  根节 ...

  8. 踹树(Trie 字典树)

    Trie 字典树 ~~ 比 KMP 简单多了,无脑子选手学不会KMP,不会结论题~~ 自己懒得造图了OI WIKI 真棒 字典树大概长这么个亚子 呕吼真棒 就是将读进去的字符串根据当前的字符是什么和所 ...

  9. trie字典树详解及应用

    原文链接    http://www.cnblogs.com/freewater/archive/2012/09/11/2680480.html Trie树详解及其应用   一.知识简介        ...

  10. Trie字典树 静态内存

    静态字典树 看了好久的字典树,挺简单的一个结构,愣是看了这么久才写出来... 专心一点就不会这样了.... 接下来就去刷刷字典树的题吧....... 下面是字典树.... 定义节点 typedef s ...

随机推荐

  1. Qt中如何在QCursor移动的时候不触发moveEvent

    有时候有这样的需求,比如想对全局光标进行一次setPos(),但这个时候又不想触发消息队列触发mouseMoveEvent,这个时候就可以这么做. myWidget->clearFocus(); ...

  2. 妙用git rebase --onto指令

    有时候,在分支提交更改的时候,会忘记rebase,就直接提交上去,或者忘记和本地远程分支做merge,就直接rebase了别的分支.有时候真希望有一种切片的方式,让自己的分支只需要接上某一段.这个时候 ...

  3. 04_RHEL7.1忘记root密码

    在开机进入启动项时,选择需要重设密码的那个启动项 按e进入编辑模式,找到rhgb和quiet参数(几乎在最下面),替换为 init=/bin/sh 按ctrl+X不需密码进入shell 以rw的方式重 ...

  4. 页面d初始化加载

    1.$(document).ready(function () { alert("Hello Word!"); }); 或简写为 2.$(function(){ alert(&qu ...

  5. c程序代码的内存布局(学好C的基础)

    一个程序本质上都是由 BSS 段.data段.text段三个组成的.这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配, ...

  6. Autoit实现分割字符串,循环输出元素

    #include <MsgBoxConstants.au3> Local $aDays = StringSplit("Mon,Tues,Wed,Thur,Fri,Sat,Sun& ...

  7. 解决octave for windows安装包无法通过SourceForge下载的问题

    近期SourceForge访问不了,可以通过访问SourceForge的ftp镜像ftp://sourceforge.nchc.org.tw/进行下载: ftp下载工具可以使用FileZilla,可在 ...

  8. zoj 3777 Problem Arrangement

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意:给出n道题目以及每一道题目不同时间做的兴趣值,让你求出所有做题顺序 ...

  9. ListView OnScrollListener详解(滑屏分页显示数据)

    package com.action; import java.util.ArrayList; import java.util.List; import android.app.Activity; ...

  10. [置顶] Guava学习之ArrayListMultimap

    ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...