自用数据结构-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;
}
}
}
}
}