RB树与总和

时间:2015-03-22 11:58:07

标签: algorithm data-structures tree red-black-tree

我对增加数据结构有一些疑问:


设S = {k1 ,. 。 。 ,kn} 是一组数字。设计高效 S的数据结构,支持以下两个操作:

插入(S,k),插入 将数字k转换为S(您可以假设k尚未包含在S中)和TotalGreater(S,a) 它返回大于a的所有键ki∈S的总和,即 Pki∈S,ki> a ki

争论两个操作的运行时间并为 TotalGreater(S,a)提供伪代码(不给出插入(S,k)的伪代码 )。


我不明白怎么做这个,我想在RB树上添加一个名为sum的额外字段,但是它不起作用,因为有时我只需要左边节点的总和,有时我也需要正确节点的总和。

所以我想添加两个名为leftSum和rightSum的字段,如果当前节点是> GivenValue然后将子节点总和的缓存值添加到当前总和值。

有人可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

您只需向每个节点添加一个变量size,这是以该节点为根的子树中的节点数。当找到具有大于值a的最小值的节点时,在该节点的路径上可能发生两件事:您可以向左或向右移动。每次向左转,都会将正确孩子的大小+ 1添加到运行总计中。每次你走对了,你什么都不做。

终止有两个条件。 1)我们找到一个包含精确值a的节点,在这种情况下,我们将其右子的大小添加到总数中。 2)我们到达一个叶子,在这种情况下,如果它大于a,我们加1,如果它小,我们加1。

答案 1 :(得分:0)

正如Jordi所描述的:关键词可能是增强的红黑树。