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

2019-05-16  本文已影响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 性质

2 特殊场景

2.1 满二叉树编码表示

图3:二叉树

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

上一篇下一篇

猜你喜欢

热点阅读