自用数据结构-Trie

自用数据结构

tags trie digital tree radix tree prefix tree

#define ALPHABETS 26
#define CASE 'a'
#define MAX_WORD_SIZE 25

class Node {
    public:
        Node(Node* parent=NULL) {
            child.resize(ALPHABETS, NULL);
            is_word = false;
            prt = parent;
            
        }
        Node* prt;
        vector<Node*> child;
        bool is_word;
};

void insertWord(Node* trieTree, string word) {
    Node* traverse = trieTree;
    for (char c : word) {
        if (traverse->child[c] == NULL) {
            traverse->child[c] = new Node(traverse);
        }
        traverse = traverse->child[c];
    }
    traverse->is_word = true;
}

Node* searchWord(Node* treeNode, string word) {
    for (char c : word) {
        if (treeNode->child[c] != NULL) {
            treeNode = treeNode->child[c];
        } else {
            return NULL;
        }
    }
    return treeNode;
}

void removeWord(Node* trieTree, string word) {
    Node* trieNode = searchWord(trieTree, word);
    if (trieNode == NULL || !trieNode->is_word) {
        return;
    }
    trieNode->is_word = false;
    bool noChild = true;
    int childCount = 0;
    int i;
    for (i = 0; i < ALPHABETS; i++) {
        if (trieNode->child[i] != NULL) {
            noChild = false;
            ++childCount;
        }
    }
    if (!noChild) {
        return;
    }
    Node* parentNode;
    while(!trieNode->is_word && trieNode->prt != NULL && childCount == 0) {
        childCount = 0;
        parentNode = trieNode->prt;
        for (i = 0; i < ALPHABETS; i++) {
            if (parentNode->child[i] != NULL) {
                if (trieNode == parentNode->child[i]) {
                    parentNode->child[i] = NULL;
                    delete trieNode;
                    trieNode = parentNode;
                } else {
                    ++childCount;
                }
            }
        }
    }
}
    
posted @ 2017-08-01 10:15  whensean  阅读(170)  评论(0)    收藏  举报