字典树(Trie树)

基本结构:

字典树,即Trie树,又称单词查找树或键树,是一种树形结构。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。

优点:

最大限度地减少无谓的字符串比较,查询效率比哈希表高。

基本性质:

1.结点本身不存完整单词。
2.从根到某一结点,路径上经过的字符连接起来,为该结点对应的字符串。
3.每个结点的所有子结点路径代表的字符都不相同。
核心思想:
Trie树的核心思想是空间换时间。
利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。

代码实现:

#include<iostream>
#include<vector>
using namespace std;
class TrieNode{ //Trie树的结点
    private:
        int R;
        vector<TrieNode*> links;
        bool end;
    public:
        TrieNode(){
            R=26;
            links.resize(R,NULL);
            end=false;
        }
        bool containsKey(char ch){
            return links[ch-'a']!=NULL;
        }
        TrieNode* get(char ch){
            return links[ch-'a'];
        }
        void put(char ch,TrieNode* node){
            links[ch-'a']=node;
        }
        void setEnd(){
            end=true;
        }
        bool isEnd(){
            return end;
        }
};
void insert(TrieNode* root,string word){ //把单词插入Trie树
    TrieNode* node=root;
    for(int i=0;i<word.size();i++){
        if(!node->containsKey(word[i])){
            node->put(word[i],new TrieNode());
        }
        node=node->get(word[i]);
    }
    node->setEnd();
}
TrieNode* search(TrieNode* root,string word){//单词word若在Trie树中返回叶子结点,否则返回NULL
    TrieNode* node=root;
    for(int i=0;i<word.size();i++){
        if(node->containsKey(word[i])){
            node=node->get(word[i]);
        }else{
            return NULL;
        }
    }
    return node;
}
bool find(TrieNode* root,string word){//查看Trie树中是否存在单词word
    TrieNode* node=search(root,word);
    return node!=NULL&&node->isEnd();
}
bool startsWith(TrieNode* root,string word){//查看Trie树中是否存在前缀word
    TrieNode* node=search(root,word);
    return node!=NULL;
}
int main(){
    TrieNode* root=new TrieNode();
    insert(root,"apple");
    insert(root,"orange");
    if(find(root,"apple")){
        cout<<"找到了单词apple"<<endl;
    }
    return 0;
}

练习题目:

实现Trie前缀树
单词搜索II

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值