字典树

Trie 是一颗非典型的多叉树模型
每个节点分裂成对应26个字母的子节点,从上往下形成任一单词的前缀
下面来定义一个字典树的类

1. 属性

class Trie {
private:
    bool isEnd;//是否为叶子节点
    Trie* next[26];//26棵子树
public:
    //方法将在下文实现...
};

2. 插入方法

void insert(string word) {
    Trie* node = this;
    for (char c : word) {//从左往右遍历每一个字母
        if (node->next[c-'a'] == NULL) //没有节点的话,新建节点
            node->next[c-'a'] = new Trie();
        node = node->next[c-'a'];//进入下一节点
    }
    node->isEnd = true;//叶子节点标志,说明这个单词已插入
}

3. 查询方法

bool search(string word) {
    Trie* node = this;
    for (char c : word) {
        node = node->next[c - 'a'];//往下遍历
        if (node == NULL) {
            return false;//这条分支没有打通
        }
    }
    return node->isEnd;//将存在的结果返回
}

4. 前缀匹配方法

bool startsWith(string prefix) {
    Trie* node = this;
    for (char c : prefix) {
        node = node->next[c-'a'];
        if (node == NULL) {
            return false;
        }
    }
    return true;//有路径直接返回true
}

5. 整个类

class Trie {
private:
    bool isEnd;
    Trie* next[26];
public:
    Trie() {
        isEnd = false;
        memset(next, 0, sizeof(next));
    }
    
    void insert(string word) {
        Trie* node = this;
        for (char c : word) {
            if (node->next[c-'a'] == NULL) {
                node->next[c-'a'] = new Trie();
            }
            node = node->next[c-'a'];
        }
        node->isEnd = true;
    }
    
    bool search(string word) {
        Trie* node = this;
        for (char c : word) {
            node = node->next[c - 'a'];
            if (node == NULL) {
                return false;
            }
        }
        return node->isEnd;
    }
    
    bool startsWith(string prefix) {
        Trie* node = this;
        for (char c : prefix) {
            node = node->next[c-'a'];
            if (node == NULL) {
                return false;
            }
        }
        return true;
    }
};
posted @   失控D大白兔  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示