美文网首页
探究:是否可以通过编码的形式计算树节点的一些属性

探究:是否可以通过编码的形式计算树节点的一些属性

作者: 江海小流 | 来源:发表于2019-05-16 21:14 被阅读0次

    1 引入

    图1: 二叉树示例

    对于一个二叉树,从根节点出发,使用由LR组成的字符串表示路径,则对于每一条路径可以唯一表示每一个节点。如图1所示:4号节点可以对应字符串 LR,2号节点对应字符串R。特别的,根节点对应的字符串为空字符串。

    1.1 更加一般的情况

    类比于二叉树,可以通过扩展LR的字符集,来适应一个节点有超过两个孩子节点的情形,例如图2中的4号节点,可以用字符串C来表示。

    图2:一般的树结构

    1.2 符号说明

    1. V是树的节点集合,则可以通过上述过程,将每一个节点映射成一个字符串,设字符串的集合为S
    2. 定义函数f, g,使得\forall v \in V, f(v) = s, s \in S以及\forall s \in S, g(s) = v, v \in S
    3. 定义ancestor(v) \subset V(v \in V) 是一个集合,该集合的所有节点均是v的祖先节点;
    4. 定义distance(u, v), (u, v \in V)u节点和v节点之间的距离;
    5. 定义lca(u, v) \in V(u, v \in V)是一个节点,表示u号节点于v号节点的最近公共祖先。在图1中,lca(3, 4) = 1lca(4, 2) = 0
    6. 假设s是一个长度为n的字符串,则prefix(s) = \{s[0], s[0..1], s[0..2], \cdots, s[0..n-1]\},用于表示字符串s所有的前缀的集合;
    7. 假设S'是一个字符串结合,longest(S') = ssS'中最长的字符串之一,且在最长的字符串中字典序最大;
    8. 假设s是一个字符串,length(s)表示字符串s的长度。

    1.3 性质

    • 对于任意的字符串s_1s_2,分别对应树中的节点v_1v_2,有:
      1. 如果s_1 \in prefix(s_2),那么节点v_1 \in ancestor(v_2)
      2. lca(v_1, v_2) = g( longest(prefix(s_1) \cap prefix(s_2)))
      3. distance(v_1, v_2) = length(s1) + length(s2) -length(f(lca(v_1, v_2))

    2 特殊场景

    2.1 满二叉树编码表示

    图3:二叉树

    对于一个满二叉树,如果将节点按照层序遍历的顺序从1开始编号,就可以根据节点的二进制位表示,来获取到对应的字符串。如图3所示。值得注意的是,该编码与第一节相比,每一个字符串多了一个字符1

    相关文章

      网友评论

          本文标题:探究:是否可以通过编码的形式计算树节点的一些属性

          本文链接:https://www.haomeiwen.com/subject/qaiwaqtx.html