如何处理红黑树的重复?

时间:2016-03-18 12:10:55

标签: algorithm binary-tree red-black-tree

所以我(迄今为止没有成功)尝试让我的红黑树实现与重复一致,但似乎总是缺少那些小东西,所以我在这里。

我尝试将树倾斜到一边,但它似乎没有正确地平衡它(从颜色的角度来看)。我想问一下如何将重复添加到红色中-black tree?(显然使节点变胖,保持或指向重复的键值)。

不是真的在寻找代码审查,对建议更感兴趣。所以基本上我用于插入和平衡的方法(取自“算法导论”,第三版)就是这些(旋转非常明显):

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:4)

如果你看一下你在这里写的伪代码,那么关键是否重复的问题是完全不可知的。这里的代码只查看比较键的结果,并不关心它们是否相同。实际上,唯一键实现需要不遗余力地使RB-Insert检测重复键。数据结构自然不关心这一点,算法和证明确定是否存在重复的密钥。如果您正确实现了这些功能,它应该按原样运行。

我也不同意建议你持有你所谓的“胖节点”的评论。例如,持有多个键是C ++ std::multimap的常见实现。从计算复杂性的角度来看,并不是说你完全 n 键,但每个 k 都是一个倍数。使用“高效”胖节点版本,基本查找操作的复杂性将是Θ(log(n / k))=Θ(log(n) - log(k));使用多密钥版本,复杂性将是Θ(log(n))。在现实生活中,可能 k<< n ,这意味着相对差异可以忽略不计。