01 | //删除一个单词,以及只和这个单词所相关的中间结点,不删除root |
02 | //当一个结点的isStr为false 而且next都为空时就可以断定它只和该word相关,可以删除 |
03 | bool Trie::deleteWord( const char * word) |
04 | { |
05 |
TrieNode * current = root; |
06 |
std::stack<TrieNode*> nodes; //用来记录经过的中间结点,供以后自下而上的删除 |
07 |
while (*word != '\0' && current != 0) |
08 |
{ |
09 |
nodes.push(current); //经过的中间结点压栈 |
10 |
current = current->next[*word - 'a' ]; |
11 |
} |
12 |
if (current && current->isStr) |
13 |
{ |
14 |
current->isStr = false ; //此时current指向该word对应的叶子结点 |
15 |
while (nodes.size() != 0) |
16 |
{ |
17 |
char c = *(--word); |
18 |
current = nodes.top()->next[c - 'a' ]; //取得当前处理的结点 |
19 |
bool allNull = true ; |
20 |
for ( int i=0;i<26;++i) //判断该结点是否所有的next为空 |
21 |
{ |
22 |
if (current->next[i] != 0) |
23 |
{ |
24 |
allNull = false ; |
25 |
} |
26 |
} |
27 |
if (current->isStr == 0 && allNull == 0) //当一个结点的isStr为false 而且next都为空时就可以断定它只和该word相关,可以删除 |
28 |
{ |
29 |
delete current; |
30 |
} |
31 |
else //说明当前这个中间结点也被其他的结点所用,不能删除。 |
32 |
{ |
33 |
break ; |
34 |
} |
35 |
nodes.top()->next[c - 'a' ] = 0; //把上层的结点的next中指向current结点的指针清0 |
36 |
nodes.pop(); |
37 |
} |
38 |
return true ; |
39 |
} |
40 |
else |
41 |
{ |
42 |
return false ; |
43 |
} |
44 | } |