畸形二进制绳索树

时间:2014-02-25 18:50:03

标签: string algorithm data-structures binary-tree malformed

我正在尝试将rope tree实现为字符串的替代数据结构。

维基百科页面不清楚拆分树的规则,但these rules似乎最初起作用。但是经过一些拆分操作后,我得到了一棵无效的树:

          6
          /\
         /  \
        4    \
       /\     \    
      /  \     \
     /    2     4
    /     /\    /\
   4     2  3  4 7
   A     B  C  D E

数字表示节点的权重,以及叶子的子字符串长度。在这个格式错误的树中,永远无法访问子字符串C.

好树的例子。根据维基百科上的解释,每个角色都可以到达。

        6
        /\
       /  \
      /   7    
     /    /\
    4    3  \
   / \  / \  \
   4  2 3 4   7
   A  B C D   E

我没有CS背景,所以我不知道这棵树有什么问题。我甚至不知道如何正确地表达这棵树的问题。这棵树有什么问题(在CS术语中),我该如何解决?

1 个答案:

答案 0 :(得分:2)

root违反了以下不变量:

  

每个节点的权重是其左子树中所有叶子权重的总和。

你的第二棵树通过改变结构来修复不变量,但这不是必需的。这是使用具有相同结构的不同权重的更正版本:

     r: 9
       /\
      /  \
  a: 4    \
    /\     \    
   /  \     \
  / b: 2     4
 /     /\    /\
4     2  3  4  7
A     B  C  D  E

要到达C中的第一个字符(如果我们假设从1开始编制索引,则会在第7个位置),您将根据Wikipedia文章运行Index(r, 7)。这是“日志”:

  • 找出7< 9,所以返回Index(a, 7)
  • 找出7> 4,所以返回Index(b, 3)
  • 找出3> 2,所以返回Index(C, 1)
  • 返回C
  • 的第一个字符

附录:

请注意,维基百科文章提出以下(不同!)不变量:

  

每个节点的“权重”等于其字符串的长度加上其左子树中所有权重的总和。

这个表述与上面的图片不符:

Wikipedia Rope Tree Example

根据上述不变量,图片中的节点B必须具有15的权重。