String 畸形二叉rope树

String 畸形二叉rope树,string,algorithm,data-structures,binary-tree,malformed,String,Algorithm,Data Structures,Binary Tree,Malformed,我试图实现一个字符串作为字符串的替代数据结构 维基百科页面不清楚拆分树的规则,但一开始似乎是可行的。但是,经过几次拆分操作后,我得到了一个无效的树: 6 /\ / \ 4 \ /\ \ / \ \ / 2 4 / /\ /\ 4 2 3 4 7 A B C D E 这些数字表示节点

我试图实现一个字符串作为字符串的替代数据结构

维基百科页面不清楚拆分树的规则,但一开始似乎是可行的。但是,经过几次拆分操作后,我得到了一个无效的树:

          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术语)以及如何解决它?

根违反了以下不变量:

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

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

     r: 9
       /\
      /  \
  a: 4    \
    /\     \    
   /  \     \
  / b: 2     4
 /     /\    /\
4     2  3  4  7
A     B  C  D  E
根据维基百科的文章,要到达
C
中的第一个字符(如果我们假设基于1的索引,则位于第7位的字符),您将运行
Index(r,7)
。以下是“日志”:

  • 找出7<9,然后返回
    索引(a,7)
  • 找出7>4,然后返回
    索引(b,3)
  • 找出3>2,然后返回
    索引(C,1)
  • 返回
    C的第一个字符
增编:

请注意,Wikipedia的文章提出了以下(不同!)不变量:

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

此公式与正上方的图片不匹配:


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

谢谢!不知何故,我在脑海中形成了以下规则:节点的权重=node.left.weight+node.left.right.weight。正如您所说的,应该是node.left.weigth+node.left。(所有右侧节点的权重)