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