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的第一个字符
根据上述不变量,图片中的节点
B
的权重必须为15。谢谢!不知何故,我在脑海中形成了以下规则:节点的权重=node.left.weight+node.left.right.weight。正如您所说的,应该是node.left.weigth+node.left。(所有右侧节点的权重)