C++实现前缀树

在这里插入图片描述

1. 什么是前缀树

假设这里有一个字符串数组,和一个树的根结点:
在这里插入图片描述
这个结点的pass意思是:有几个字符通过了这个结点。end的意思是:有一个字符串是以这个结点结尾的

第一个字符串:“abc”,从头结点开始出发。我们首先看有没有a这条路,没有a这条路我们就创建。
在这里插入图片描述
创建这条路后,我们到下一个结点。因为已经到了这个结点,所以下一个结点的pass也加1。

然后我们再看b,也没有b这条路,我们再创建b。
在这里插入图片描述
我们再看c,也没有,我们再把c的路创建出来。
在这里插入图片描述
因为c是结尾,在c下一个结点中我们要把end加1。

我们再看"abd"这个字符串,从根结点开始出发,a有这条路,b有这条路,但是d没有这条路,我们就需要创建d这条路。
在这里插入图片描述
那么"bc"这个字符串,要从根结点开始,根结点下面没有b这条路,所以我们还是要创建。
在这里插入图片描述
其它的都是一样思路,那么这个前缀树它能做些什么呢?我们可以求每个字符串出现了多少次,和求某个字符串是否是前缀字符串。

2. 前缀树的实现

2.1 前缀树的基本结构

在这里插入图片描述
我们在结点里加了一个map的作用是记录当前结点的下级有多少条路和每条路结尾的结点。

2.2 插入

在这里插入图片描述

2.3 word出现了几次

在这里插入图片描述
这里我们只需要一直找路,如果路为空了,就说明没有这个字符串,我们直接返回0。如果一直到字符串找完,我们看最后结点的end是几,这个字符串就说明出现了几次。

2.3 word作为前缀出现几次

在这里插入图片描述
这个和上面是同样的道理,只是这样改成了最后结点的pass个数。

2.4 删除

在这里插入图片描述
假设我们想删除"abd"这个字符串,一开始就让根结点的pass减减,然后我们找到下一个结点的位置先减减,看它的pass为不为0。
在这里插入图片描述
不为0,我们继续往下,先pass减减看它为不为0。
在这里插入图片描述
不为0,我们继续往下,先pass减减看它为不为0。
在这里插入图片描述
此时结点的pass为0了,我们就需要让这个结点和这个结点以下的结点全部析构。
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学代码的咸鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值