说明:

以下代码是个人按照自己的理解写的,可能有错误或者不太规范的地方,欢迎指出!

代码如下:

//插入、删除、查询、遍历四种操作
//注意:四种操作的函数实现中,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++实现的更多相关文章

  1. 字典树(Trie树)的实现及应用

    >>字典树的概念 Trie树,又称字典树,单词查找树或者前缀树,是一种用于快速检索的多叉树结构,如英文字母的字典树是一个26叉树,数字的字典树是一个10叉树.与二叉查找树不同,Trie树的 ...

  2. [POJ] #1002# 487-3279 : 桶排序/字典树(Trie树)/快速排序

    一. 题目 487-3279 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 274040   Accepted: 48891 ...

  3. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  4. 洛谷$P4585\ [FJOI2015]$火星商店问题 线段树+$trie$树

    正解:线段树+$trie$树 解题报告: 传送门$QwQ$ $umm$题目有点儿长我先写下题目大意趴$QwQ$,就说有$n$个初始均为空的集合和$m$次操作,每次操作为向某个集合内加入一个数$x$,或 ...

  5. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  6. [转载]字典树(trie树)、后缀树

    (1)字典树(Trie树) Trie是个简单但实用的数据结构,通常用于实现字典查询.我们做即时响应用户输入的AJAX搜索框时,就是Trie开始.本质上,Trie是一颗存储多个字符串的树.相邻节点间的边 ...

  7. Luogu P2922 [USACO08DEC]秘密消息Secret Message 字典树 Trie树

    本来想找\(01Trie\)的结果找到了一堆字典树水题...算了算了当水个提交量好了. 直接插入模式串,维护一个\(Trie\)树的子树\(sum\)大小,求解每一个文本串匹配时走过的链上匹配数和终点 ...

  8. 字典树 trie树 学习

    一字典树 字典树,又称单词查找树,Trie树,是一种树形结构,哈希表的一个变种   二.性质 根节点不包含字符,除根节点以外的每一个节点都只包含一个字符: 从根节点到某一节点,路径上经过的字符串连接起 ...

  9. 【字符串算法】字典树(Trie树)

    什么是字典树 基本概念 字典树,又称为单词查找树或Tire树,是一种树形结构,它是一种哈希树的变种,用于存储字符串及其相关信息. 基本性质 1.根节点不包含字符,除根节点外的每一个子节点都包含一个字符 ...

  10. 字典树 Trie树

    什么是Trie树? 形如 其中从根节点到红色节点的路径上的字母所连成的字符串即为一个Trie树上所存的字符串. 比如,这个trie树上有ab,abc,bd,dda这些字符串. 至于怎么构建和查找或添加 ...

随机推荐

  1. 【java小工具】从.java文件中筛选出方法,并计算出方法在这些文件中出现的次数

    package getMethod; import java.io.*; import java.util.*; import java.util.regex.Matcher; import java ...

  2. POJ 3099 Go Go Gorelians

    http://poj.org/problem?id=3099 树的重心:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心 求树的重心 如何在点中构造符合条件的树 得到树后 从 ...

  3. 巴蜀1088 Antiprime数

    Description 如果一个自然数n(n>=1),满足所有小于n的自然数(>=1)的约数个数都小于n的约数个数,则n是一个Antiprime数.譬如:1, 2, 4, 6, 12, 2 ...

  4. TYVJ4623 球球大作战·生存

    时间: 500ms / 空间: 65536KiB / Java类名: Main 背景 小天很喜欢玩球球大作战这个游戏,大家也应该都玩过.游戏规则是:移动自己的球,移动到别人的球(一定要比自己的球小)的 ...

  5. 济南学习 Day 5 T2 晚

    等比数列(sequence) [题目描述] 判断一个数列是否为等比数列. 等比数列的定义为能被表示成a,aq,aq^2,aq^3...的数列,其中a和q不等于0. [输入说明] 输入文件的第一行有一个 ...

  6. 使用 ftrace 调试 Linux 内核,第 3 部分

    内核头文件 include/linux/kernel.h 中描述了 ftrace 提供的工具函数的原型,这些函数包括 trace_printk.tracing_on/tracing_off 等.本文通 ...

  7. Oracle的memory_max_target和memory_target修改和ORA-00845: MEMORY_TARGET not supported on this system错误解决

    https://blog.csdn.net/sunny05296/article/details/56495599

  8. 用delphi写多屏幕程序

    http://blog.csdn.net/zyyjc/article/details/6530728 别现在有些POS机是双屏幕的(比如卡西瓦POS机),一个屏幕可以当顾客显示屏用,当闲时也可以显示一 ...

  9. jpaRepository findById()数据库有数据却为null

    oracle中的char类型用空格自动将字段补成指定的长度, 而varchar2类型不会.大部分情况下设计表字段类型都是varchar2,今天被char坑了一次, findById()始终为空..

  10. 微信公众账户的开发者模式(一) 部分细节access_token的获取等

    十四老久没有写博客了,中间经历了,事业,感情的几分波折.现在终于稍微缓过来一点.又是一次从头开始,走在匆忙的路上. 好了煽情完了,直接上代码了. 基础就不说了我用的是vs2005开发的,部署在iis6 ...