字典树(Tire树)
字典树(Tire树)
字典树是一种多叉树,又称前缀树。核心思想是利用字符串的公共前缀。
字典树本质是一个森林,通过空的根节点转换成有根树便于研究;从根节点到某一节点路径上的字符连接起来构成完整字符串,完整字符串是由一条链构成;一个节点的所有子节点都具有相同公共前缀。
普通Tire树
struct node{
bool end;//标记该位置是否为一个单词的结束点(并非全部都为叶子结点)
int child[26];//下标用于存储英文字符,数组本身存储该字符的孩子结点的位置
}tree[MAX];
int cnt=1;//字典树的当前工作指针,代表插入下个字符时的存储位置。根节点为空,cnt从1开始
由于字典树插入/查询复杂度均为 O ( n ) O(n) O(n),因此采用数组/链表实现复杂度相同
插入( O ( n ) O(n) O(n))
void insert(string s){
int idx=0;//当前字符在字典树中的位置
for(int i=0;i<s.size();i++){
int c=s[i]-'a';
if(!tree[idx].child[c]) tree[idx].child[c]=cnt++;//若先前无此前缀字符,则执行插入结点操作(首次即为根节点)
idx=tree[idx].child[c];//更新当前位置指针到其孩子结点
if(i==s.size()-1) tree[idx].end=1;//i越界代表一个单词完整插入,在其最后一个字符处标记结束
}
}
查询( O ( n ) O(n) O(n))
bool check(string s){
int idx=0;//当前字符在字典树中的位置
for(int i=0;i<s.size();i++){
int c=s[i]-'a';
if(!tree[idx].child[c]) return 0;//未在字典树中找到该字符串的前缀,则查找失败
idx=tree[idx].child[c];
}
if(!tree[idx].end) return 0;//未找到结尾标记,代表该字符串为某个字符串的前缀,但未找到该字符串本身,查找失败
return 1;//查找成功
}
01Tire树
将数字的二进制表示插入到Tire树中。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具