文章目录
- 1. 什么是前缀树
- 2. 前缀树的实现
- 2.1 前缀树的基本结构
- 2.2 插入
- 2.3 word出现了几次
- 2.3 word作为前缀出现几次
- 2.4 删除
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了,我们就需要让这个结点和这个结点以下的结点全部析构。