上篇内容有在介绍 Gin 的路由实现时提到了前缀树,这次我们稍微深入探究一下前缀树的实现。
本文以一道编程题为例,讲述前缀树的实现,以及前缀树的一种优化形态压缩前缀树。
MapSum 问题
LeetCode 上有一道编程题是这样的
实现一个 MapSum 类里的两个方法,insert 和 sum。
对于方法 insert,你将得到一对(字符串,整数)的键值对。字符串表示键,整数表示值。如果键已经存在,那么原来的键值对将被替代成新的键值对。
对于方法 sum,你将得到一个表示前缀的字符串,你需要返回所有以该前缀开头的键的值的总和。
示例 1:
输入: insert("apple", 3), 输出: Null
输入: sum("ap"), 输出: 3
输入: insert("app", 2), 输出: Null
输入: sum("ap"), 输出: 5
前缀树
根据题意,我们定义的 MapSum 的数据结构为:
type MapSum struct {
char byte
children map[byte]*MapSum
val int
}
/** Initialize your data structure here. */
func Constructor() MapSum {
}
func (this *MapSum) Insert(key string, val int) {
}
func (this *MapSum) Sum(prefix string) int {
}
假设输入数据为:
m := Constructor()
m.Insert("inter", 1)
m.Insert("inner", 2)
m.Insert("in", 2)
m.Insert("if", 4)
m.Insert("game", 8)
则构造