01
|
//删除一个单词,以及只和这个单词所相关的中间结点,不删除root
|
02
|
//当一个结点的isStr为false
而且next都为空时就可以断定它只和该word相关,可以删除
|
03
|
boolTrie::deleteWord(constchar*
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
|
charc
= *(--word);
|
18
|
current
= nodes.top()->next[c -'a'];//取得当前处理的结点
|
19
|
boolallNull
=true;
|
20
|
for(inti=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
|
deletecurrent;
|
30
|
}
|
31
|
else//说明当前这个中间结点也被其他的结点所用,不能删除。
|
32
|
{
|
33
|
break;
|
34
|
}
|
35
|
nodes.top()->next[c
-'a']
= 0;//把上层的结点的next中指向current结点的指针清0
|
36
|
nodes.pop();
|
37
|
}
|
38
|
returntrue;
|
39
|
}
|
40
|
else
|
41
|
{
|
42
|
returnfalse;
|
43
|
}
|
44
|
}
|
8047

被折叠的 条评论
为什么被折叠?



