字典树

来源:互联网 发布:遥控怎么切换网络电视 编辑:程序博客网 时间:2024/06/06 02:45

字典树


#include <cstdio>using namespace std;#define TREE_WIDTH 26struct Node {    int path;    int end;    char ch;    Node * next[TREE_WIDTH];    Node (char ch = ' ') {        this -> ch = ch;        this -> path = this -> end = 0;        for (int i = 0; i < TREE_WIDTH; i++) {            this -> next[i] = nullptr;        }    }};class TrieTree {private:    Node * root;public:    TrieTree ();    ~TrieTree ();    void destroy (Node * t);    void add (char * s);    int query (char * s);    bool remove (char * s);};TrieTree::TrieTree () {    root = new Node;}TrieTree::~TrieTree () {    destroy (root);}void TrieTree::destroy (Node * t) {    for (int i = 0; i < TREE_WIDTH; i++) {        if (t -> next[i]) {            destroy (t -> next[i]);        }    }    delete t;}void TrieTree::add (char * s) {    Node * t = root;    while (*s) {        if (t -> next[*s - 'a'] == nullptr) {            t -> next[*s - 'a'] = new Node(*s);        }        t -> next[*s - 'a'] -> path++;        t = t -> next[*s - 'a'];        s++;    }    t -> end++;}int TrieTree::query (char * s) {    Node * t = root;    while (*s) {        if (t -> next[*s - 'a'] == nullptr || t -> next[*s - 'a'] == 0) {            return 0;        }        t = t -> next[*s - 'a'];        s++;    }    return t -> end;}bool TrieTree::remove (char *s) {    Node * t = root;    if (query (s)) {        Node * t = root;        while (*s) {            t -> next[*s - 'a'] -> path--;            t = t -> next[*s - 'a'];            s++;        }        t -> end--;        return true;    }    return false;}int main () {    TrieTree tree;    return 0;}



原创粉丝点击