trie-树详解(后续)

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 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值