【问题标题】:Malformed binary rope tree畸形二叉树
【发布时间】:2014-02-25 18:50:03
【问题描述】:

我正在尝试实现 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 术语),我该如何解决?

【问题讨论】:

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


    【解决方案1】:

    根违反了以下不变量:

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

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

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

    附录:

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

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

    这个公式与上面的图片不匹配:

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

    【讨论】:

    • 谢谢!不知何故,我想到了以下规则:节点的权重 = node.left.weight + node.left.right.weight。正如你所说,那应该是 node.left.weigth +node.left.(所有正确的权重)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    • 2012-01-09
    • 2013-12-06
    相关资源
    最近更新 更多