字典树与双数组字典树

本文介绍了字典树的概念及其在代码实现中的应用,包括查找和排序功能。接着,深入讨论了双数组字典树,尽管其逻辑结构保持不变,但采用了不同的信息表示方式。同时,提到了该数据结构在LeetCode上的搜索推荐系统问题的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树的节点代表集合
树的代表关系

字典树代码

查找代码

#include<iostream>
#include<cstdio>
#include<queue>
#include<stack>
#include<algorithm>
#include<string>
#include<map>
#include<set>
#include<vector>
using namespace std;

#define BASE 26
//字典树节点
class node{
   
public :
    //结点初始化
    node(){
   
        flag = false;
        for(int i=0;i<BASE;i++) next[i] = nullptr;//每个字典树的next结点设定为空
    }
    ~node(){
   
        delete node;
    }
    bool flag;//当前节点是否独立成词 (是红色结点还是白色结点)
    node *next[BASE];//节点只存储小写字母
};
//定义字典树类
class Trie{
   
public:
    Trie(){
   
        root = new node();//给root分配新的结点空间
    }
    //传入一个字符串然后插入到字典树中去
    bool insert(string word){
   //这个方法表示是否是第一次插入这个单词
        //定义一个指针变量指向根结点
        node *p = root;
        for(auto x:word){
   //遍历每一个单词字母
            int ind = x-'a';
            //如果当前节点的边下边没有结点的话新建一个node 
            if(p->next[ind]==nullptr)p->next[ind]=new node();
            p=p->next[ind];
        }
        if(p->flag) return false;//如果p->flag本身就不为true了说明不是第一次插入这个单词
        //插入完单词后需要将单词最后一个节点变成红色
        p->flag=true;
        return true;

    }
    //字典树的单词查找操作
    bool search(string word){
   
        node *p = root;//字典树操作永远从根结点开始操作因为根结点代表全集
        for(auto x:word){
   
            int ind = x-'a';
            p = p->next[ind];//p先沿着边向下走一步
            if(p==nullptr) return false;//p走到空节点说明字典树中根本就没有这个单词
        }
        //此时说明我沿着word每一个单词走的不是空节点 需要判断我们当前所在结点是白色还是红色呀, 只有它是红色才证明它是一个独立的单词
        return p->flag;
    
    }

    static void clearTrie(node *root){
   
        if(root==nullptr)return ;
        //否则递归的销毁所有的子树
        for(int i=0;i<BASE;i++)clearTrie(root->next[i]);
        delete root;
        return ;
    }
    ~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值