字典树(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树中。
在这里插入图片描述

posted @   椰萝Yerosius  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示