字典树(Trie树) C++实现
说明:
以下代码是个人按照自己的理解写的,可能有错误或者不太规范的地方,欢迎指出!
代码如下:
//插入、删除、查询、遍历四种操作
//注意:四种操作的函数实现中,T都是指向上一个结点的指针,以此方便操作。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps = 1e-6;
const int INF = 2e9;
const LL LNF = 9e18;
const int mod = 1e9+7;
const int maxn = 100+10; typedef struct node
{
bool exist; //是否存在单词
int cnt; //作为多少个单词的前缀,不算自己
struct node *next[26]; void init()
{
exist = cnt = 0;
memset(next,0,sizeof(0));
} }Node, *Tree; void insert(Tree &T, char *s, int k)
{
if(!T)
{
T = new Node;
T->init();
} if(!s[k]) //单词尾
{
T->exist = true; //标记单词存在
}
else
{
T->cnt++; //作为前缀
insert(T->next[s[k]-'a'], s, k+1);
}
} char ans[100]; //存储路径
void traverse(Tree T, int k) //字典序遍历,实际上就是先序遍历
{
if(T->exist) //如果该节点标有单词编号,则输出路径
{
ans[k] = 0;
cout<<ans<<endl;
} for(int i = 0; i<26; i++)
{
if(T->next[i])
{
ans[k] = i+'a';
traverse(T->next[i], k+1);
}
}
} int search(Tree T, char *s, int k)
{
if(!T) return 0; //结点不存在,则单词不存在 if(!s[k]) //结点存在,还要看单词是否存在
{
return T->exist;
}
else //继续往下找
{
return search(T->next[s[k]-'a'], s, k+1);
}
} bool del(Tree &T, char *s, int k)
{
if(!T) return 0; if(!s[k])
{
if(T->cnt) //如果作为单词的前缀,则只标记此单词不存在
{
T->exist = 0;
}
else //如果不作为其他单词的前缀,则直接删除
{
delete T;
T = NULL;
}
return 1;
}
else
{
if(del(T->next[s[k]-'a'], s, k+1))
{
T->cnt--;
if(!T->exist && !T->cnt) //既不作为单词的前缀,又不作为单词,则直接删除
{
delete T;
T = NULL;
}
return 1;
}
return 0;
}
} int main()
{
Tree T;
T = new Node;
T->init(); int n;
cin>>n;
char s[100];
for(int i = 1; i<=n; i++)
{
cin>>s;
insert(T,s,0);
}
traverse(T,0); cin>>s;
del(T,s,0);
traverse(T,0); cin>>s;
cout<< search(T,s,0) <<endl;
}
字典树(Trie树) C++实现的更多相关文章
- 字典树(Trie树)的实现及应用
>>字典树的概念 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.与二叉查找树不同,Trie树的 ...
- [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序
一. 题目 487-3279 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 274040 Accepted: 48891 ...
- Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结
Atitit 常见的树形结构 红黑树 二叉树 B树 B+树 Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...
- 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树
正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...
- luoguP6623 [省选联考 2020 A 卷] 树(trie树)
luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...
- [转载]字典树(trie树)、后缀树
(1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...
- Luogu P2922 [USACO08DEC]秘密消息Secret Message 字典树 Trie树
本来想找\(01Trie\)的结果找到了一堆字典树水题...算了算了当水个提交量好了. 直接插入模式串,维护一个\(Trie\)树的子树\(sum\)大小,求解每一个文本串匹配时走过的链上匹配数和终点 ...
- 字典树 trie树 学习
一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种 二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...
- 【字符串算法】字典树(Trie树)
什么是字典树 基本概念 字典树,又称为单词查找树或Tire树,是一种树形结构,它是一种哈希树的变种,用于存储字符串及其相关信息. 基本性质 1.根节点不包含字符,除根节点外的每一个子节点都包含一个字符 ...
- 字典树 Trie树
什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...
随机推荐
- #1045 - Access denied for user 'root'@'localhost' (using password: NO)的问题
问题描述: 修改了root的密码,然后在http://localhost/phpmyadmin下无法登录了 报错:#1045 - Access denied for user 'root'@'lo ...
- Linux 如何实现 VLAN
LAN 表示 Local Area Network,本地局域网,通常使用 Hub 和 Switch 来连接 LAN 中的计算机.一般来说,两台计算机连入同一个 Hub 或者 Switch 时,它们就在 ...
- *Codeforces587E. Duff as a Queen
$n \leq 200000$的序列,支持以下$q \leq 4e4$个操作:区间异或$k$:查询区间能异或出多少不同的数.数字$0 \leq a_i \leq 1e9$. 大概是要区间线性基.区间修 ...
- 转 DOS 8.3 文件名命名规则
http://www.360doc.com/content/10/0813/14/73007_45757514.shtml DOS 8.3 文件名命名规则 经常看到命令行或者其它软件在显示目录的时候出 ...
- perl学习之精髓中的精髓
1.是函数就有返回值: 比如:chomp函数,其可以除去换行符,但其也有返回值 chomp($xx) #这是去除xx的换行符 $yy=chomp($xx) #这是看这次除去了几个换行符,也就是函数运 ...
- web信息搜索之目标扫描篇
https://blog.csdn.net/dongfei2033/article/details/78175421
- android Containers控件
1.RadioGroup 一组单选框容器 2.ListView 3.GridView 4.ExpandableListView 可折叠列表 5.ScrollView 上下滚动条 6.Horizonta ...
- T3054 高精度练习-文件操作 codevs
http://codevs.cn/problem/3054/ 题目描述 Description 输入一组数据,将每个数据加1后输出 输入描述 Input Description 输入数据:两行,第 ...
- jfinal使用idea启动 访问报404 action not found
公司一个项目,在eclipse里面启动正常,换到idea里面启动后,启动没有报错,但是访问的时候会提示404 action not found. 百度了很多种解决方法 都没有解决. 今天脑子一转,想到 ...
- Invocation of destroy method failed on bean with name ‘XXXX’
项目启动报错问题:Invocation of destroy method failed on bean with name 'scopedTarget.eurekaClient': org.spri ...