前缀树
假设我们现在有字符"a",“ab”,“ac”,“bc”,“123”,“35”,“73”,问:
- 以"a" 开头的字符有多少个?
- 是否有以"3"字符结尾的?
- 是否存在"235"这样的字符?
针对这种,我们可以根据所有字符,构建出一颗字符的前缀树:
我们可以以每一个字符,构建出一个节点,每一个节点包含两条信息:through:通过该节点的数量,end:以该节点结尾的数量。
我们先来处理字符"a":
由于我们在当前的tree中还没有“a”这个字符,我们先创建出这一点一个节点:
由于“a"经过root节点,所以root节点的through变成1,end还是0
"a"节点本身,由于字符”a"是以“a”作为结尾,所以其through变成1,end变成1
下面是处理字符“ab":
”ab“可以被拆分成两个字符:”a”和“b”
针对拆分后的字符“a",由于tree中已经存在节点a,不需要新增节点,但是本次的“a”其实不是以“a”作为结尾的,所以节点a的through变成2,end不变,还是1:
再处理拆分之后的字符“b”,由于tree中没有这个节点,需要新增“b”这个节点,同时由于“ab"是以”b“结尾的,所以end需要赋值为1:
以此类推,最终生成的tree结构如下:
问题一:
以"a" 开头的字符有多少个? 我们从root节点出发 找到包含路径”a“,through=3,即以”a"开头的有3个字符
问题二:
是否有以"3"字符结尾的? 我们从root节点出发找到包含叶子节点路径为"3",可以找到路径“123”,end =1 ,说明有2个字符是以"3"作为结尾的
问题三:
是否存在"235"这样的字符? 我们从root节点出发,我们无法找到从root直接到节点”2“的路径,所以不存在这样的字符
是否存在“a”这样的字符? 我们从root节点出发,可以找到路径“a“,虽然它不是叶子节点,但是end=1,说明有一个字符到此结束,所以存在字符"a"
是否存在”123“这样的字符? 同理从root出发,可以找到这样的路径,是叶子节点,并且end=1,说明存在这样的字符