正如标题所说,使用修改后的二叉搜索树创建的红黑树具有任意限制,即所有红色链接都是左倾的。我已经为红黑树(java)制作了一个基本程序,我很好奇如何改变它,因为它似乎很简单,但所有的解决方案都让我望而却步。
我的代码与此PDF中的代码非常相似: http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf
例如,这里是左倾版本中的treeRepair方法:
private TreeNode<Key, Value> treeRepair(TreeNode<Key, Value> node)
{
if (isRed(node.right) && !isRed(node.left)) node = rotateLeft(node);
if (isRed(node.left) && isRed(node.left.left)) node = rotateRight(node);
if (isRed(node.left) && isRed(node.right)) flipColours(node);
node.size = 1 + size(node.left) + size(node.right);
return node;
}
这很好用。它在每次插入和删除结束时运行。 这是一个经过修改的“翻转”版本,实际上可以在某些时候使用。
private TreeNode<Key, Value> treeRepair(TreeNode<Key, Value> node)
{
if (isRed(node.left) && !isRed(node.right)) node = rotateRight(node);
if (isRed(node.right) && isRed(node.right.right)) node = rotateLeft(node);
if (isRed(node.left) && isRed(node.right)) flipColours(node);
node.size = 1 + size(node.left) + size(node.right);
return node;
}
我有一个强烈的预感,它与删除方法有关,(它通常适用于大量插入,但是一次删除会导致诸如连续多个红色链接之类的问题。)但是在那里翻转左派和权限方法不可避免地产生NPE。
如果这是在本网站上提出的一个不好的问题,请告诉我。