后缀树创建的算法比较复杂,不是很好懂,个人找到了一个比较好理解的方法。下面一步一步构建一棵后缀树。以字符串 abcabxabcd 为例。
以下各图中,灰色圆表示根节点;红色表示终结,它上面的一个节点是叶子;无色表示一般节点;从根节点到叶子节点构成了当前插入的字符串的后缀。
1.基本方法
_______________________________________________________________________________
插入:a
使用的原则:
原则1:每插入一个字符,都开辟一个(根节点 -> 节点 -> 终结)的结构。
插入 a 时,开辟下面的结构:
因为之前的后缀树是空树,所以直接将上面的结构作为后缀树的初始化。
_______________________________________________________________________________
插入:b
使用的原则:
原则2:将插入的字符追加到所有终结节点的父节点的字符串值的末尾。如果父节点还有其它分支,则在终结节点与父节点之间再创建一个节点,并把字符串设为该字符(如图左边一条分支的节点,原来值为 a ,现在为 ab)
原则1:每插入一个字符,都开辟一个(根节点 -> 节点 -> 终结)的结构。(如图右边一条分支)
这里,引入一个概念,如果终结节点的父节点没有其它分支,则这个父节点是一个叶子节点。如此时,ab, b 都是叶子节点
_______________________________________________________________________________
插入:c
使用的原则:
原则2:不再缀述;
原则1:不再缀述;
插入:a
使用的原则:
原则2:不再缀述;
原则1:不再缀述;
原则3:每次插入一个字符时,都检查新生成的(根节点 -> 节点 -> 终结)结构(如果有的话),在根节点的直接子节点中找到字符串值以该字符开始的那个节点(如果有的话,只可能有一个),将它们合并。左图展示了新增的 a 节点与根节点的子节点 abca 可以合并,合并成为右图,右图即为插入到该字符时的后缀树。
_______________________________________________________________________________
插入:b
使用的原则:
原则2:不再缀述;左边的 a 节点与终结节点之间会产生一个节点,字符串值为 b。
原则1:不再缀述;
原则3:不再缀述;
原则