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