字典树

字典树


#include <cstdio>
using namespace std;
#define TREE_WIDTH 26

struct 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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值