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

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
//结构体里面可以灵活的加一些东西,根据功能来加
typedef struct Node{
int isWord;//标记是否到这里是个单词
struct Node *next[];//26个子孩子,
}Node, *PNode; void add_word(PNode *root, char *word)//将指定单词添加到字典树
{
PNode node;
int len = strlen(word);
int i = ;
PNode ptr = *root;
while(i < len)
{
if(ptr->next[word[i] - 'a'] == NULL)
{
node = (PNode)malloc(sizeof(Node));
for(int j = ; j < ; j++)
{
node->isWord = ;
node->next[j] = NULL;
}
ptr->next[word[i] - 'a'] = node;
}
ptr = ptr->next[word[i] - 'a'];
i++;
}
ptr->isWord = ;//最后标记这个点是单词的结尾
} void search_word(PNode root, char *word)//查找单词,递归方式
{
if(word[] != '\0' && root->next[word[] - 'a'] == NULL)
{
printf("No this word\n");
return;
}
if(word[] == '\0')
{
if(root == NULL)
printf("exist!\n");
else
{
if(root->isWord == )
printf("exist!\n");
else
printf("No this word\n");
}
return;
}
search_word(root->next[word[] - 'a'], word + );
}
//查找单词,非递归方式
int search_words(PNode root, char *word)
{
int len = strlen(word);
int i = ;
PNode ptr = root;
while(i < len)
{
if(ptr->next[word[i] - 'a'] == NULL)
return ;
ptr = ptr->next[word[i] - 'a'];
i++;
}
if(ptr->isWord == )
return ;
return ;
}
//删除指定的单词,这里只是将它的标记设为0, 并没有真正意义上的删除
void delete_word(PNode *root, char *word)
{
if(word[] == '\0' && (*root) != NULL)
{
(*root)->isWord = ;
return;
}
if((*root) == NULL)
{
printf("No this word\n");
return;
}
delete_word(&(*root)->next[word[] - 'a'], word + );
}
//删除整个字典树,真正的删除
//如果要在函数里面调用此函数的时候,调用完之后如果还想创建树,要重新malloc根节点
void delete_all(PNode root)
{
for(int i = ; i < ; i++)
{
if(root->next[i] != NULL)
delete_all(root->next[i]);
}
free(root);
} int main()
{
int choice;
char str[];
PNode root = (PNode)malloc(sizeof(Node));
root->isWord = ;
for(int i = ; i < ; i++)
root->next[i] = NULL;
do{
//测试菜单
printf("1. add word 2. search word 3. delete word 0. exit\n");
scanf("%d", &choice);
switch(choice)
{
case :
scanf("%s", str);
add_word(&root, str);
break;
case :
scanf("%s", str);
if(search_words(root, str) == )
printf("exist\n");
else
printf("not found\n");
//当然也可以用递归的那个
// search_word(root, str);
break;
case :
scanf("%s", str);
delete_word(&root, str);
default:
break;
}
}while(choice != );
delete_all(root);
return ;
}

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. VSS迁移

    今天花了一上午的时间,对VSS源代码库从一个服务器A上迁移到另一个服务器B上,包括修改历史.用户.以及权限.具体方法如下: 1.在服务器B上安装vss程序后,创建一database,并设置创建后的文件 ...

  2. php中的双引号和单引号的区别?

    1.单引号里面的字符串直接全部转义,原样输出(即:单引号内部的变量不会被执行) 2.双引号里面的变量会被替换(即:变量会执行) 例如:$name = 'hello';echo "the $n ...

  3. 个人Python常用Package及其安装

    为了避免每次重装系统时又要东翻西找,现在此记录一下目前常用的Python包安装过程. 1) Python: 2.7.11, 下载地址:www.python.org.由于个人喜欢使用PyQt4(其实是不 ...

  4. linux下tomcat配置APR方式HTTPS

    一.安装APR 创建/usr/local/apr tar zxvf apr-1.4.5.tar.gz cd apr-1.4.5 ./configure --prefix=/usr/local/apr/ ...

  5. svn , github工作流

    svn 需要有一台中央服务器,所有的分支,主干,标签,全都保存在这台中央服务器上.开发着需要提交代码时,需要保持中央服务器连接.切换分支时会有本地与服务器网络连接. git 改进了这一点,每台安装有g ...

  6. 百度统计js被劫持用来DDOS Github的JS注释

    前几天在乌云看见了百度统计js被劫持用来DDOS Github,就想看看执行的核心JS是怎么样请求的. 就分析了下JS的执行,发现乌云解析的地方说错了. 文章里面说.大概功能就是关闭缓存后每隔2秒加载 ...

  7. Windows消息拦截技术的应用

    Windows消息拦截技术的应用 民航合肥空管中心 周毅 一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做 ...

  8. BZOJ1596: [Usaco2008 Jan]电话网络

    1596: [Usaco2008 Jan]电话网络 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 513  Solved: 232[Submit][S ...

  9. 2015第35周五JavaScript变量

    java语言里有一句很经典的话:在java的世界里,一切皆是对象. Javascript虽然跟java没有半点毛关系,但是很多会使用javascript的朋友同样认为:在javascript的世界里, ...

  10. LeetCode——Remove Duplicates from Sorted Array

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...