红黑树被任意定义为左倾。我怎样才能让它正确倾斜?

时间:2014-03-20 17:14:34

标签: java binary-tree binary-search-tree red-black-tree

正如标题所说,使用修改后的二叉搜索树创建的红黑树具有任意限制,即所有红色链接都是左倾的。我已经为红黑树(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。

如果这是在本网站上提出的一个不好的问题,请告诉我。

0 个答案:

没有答案