俊介三

一天更新一点,一天积累一点

导航

Trie Tree(前缀树)

Posted on 2013-04-06 15:22  俊介三在前进  阅读(276)  评论(0)    收藏  举报

在计算机科学中,trie,又称前缀树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。

参考资料:维基百科 Trie树详解

应用场景:字符串精确搜索。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#define BRANCHNUM 26

using namespace std;

struct Trie_Node{
    bool isStr;
    Trie_Node* next[BRANCHNUM];
    Trie_Node(){
        isStr = false;
        memset(next, NULL, sizeof(next));
    };
};

class Trie_Tree{
public:
    Trie_Tree();
    void insert(const char* word);
    bool search(const char* word);
    void deleteTrie(const char* word);

private:
    Trie_Node* root;
};

Trie_Tree::Trie_Tree(){
    root = new Trie_Node();
}

void Trie_Tree::insert(const char* word){
    Trie_Node* location = root;
    while(*word){
        if(location->next[*word-'a']==NULL){
            Trie_Node* temp = new Trie_Node();
            location->next[*word-'a'] = temp;
        }
        location = location->next[*word-'a'];
        word++;
    }
    location->isStr = true;
}

bool Trie_Tree::search(const char* word){
    Trie_Node* location = root;
    while(location && *word){
        location = location->next[*word-'a'];
        word++;
    }
    return (location && location->isStr);
}

void Trie_Tree::deleteTrie(const char* word){
    Trie_Node* location = root;
    while(location && *word){
        location = location->next[*word-'a'];
        word++;
        if(!*word){
            location->isStr = false;    
        }
    }
}

int main(){
    Trie_Tree t;
    
    //插入一个word
    t.insert("morgan");
    t.insert("lulu");
    t.insert("iloveyou");
    t.insert("liu");

    //删除一个word
    t.deleteTrie("morgan");

    //查找word
    if(t.search("morgan")){
        printf("Yes\n");
    }else printf("No\n");

    return 0;
}