> 文章列表 > C++实现前缀树

C++实现前缀树

C++实现前缀树

在这里插入图片描述

文章目录

  • 1. 什么是前缀树
  • 2. 前缀树的实现
    • 2.1 前缀树的基本结构
    • 2.2 插入
    • 2.3 word出现了几次
    • 2.3 word作为前缀出现几次
    • 2.4 删除

1. 什么是前缀树

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

第一个字符串:“abc”,从头结点开始出发。我们首先看有没有a这条路,没有a这条路我们就创建。
C++实现前缀树
创建这条路后,我们到下一个结点。因为已经到了这个结点,所以下一个结点的pass也加1。

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

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

2. 前缀树的实现

2.1 前缀树的基本结构

C++实现前缀树
我们在结点里加了一个map的作用是记录当前结点的下级有多少条路和每条路结尾的结点。

2.2 插入

C++实现前缀树

2.3 word出现了几次

C++实现前缀树
这里我们只需要一直找路,如果路为空了,就说明没有这个字符串,我们直接返回0。如果一直到字符串找完,我们看最后结点的end是几,这个字符串就说明出现了几次。

2.3 word作为前缀出现几次

C++实现前缀树
这个和上面是同样的道理,只是这样改成了最后结点的pass个数。

2.4 删除

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