作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
除非删除根,否则我的红黑树删除算法运行良好。其中只有一个 child 被保存,其余的树值都丢失了。
我认为问题出在 removeNode()
方法中,其中
if (remove == root)
{
root = child;
}
下面是删除的方法:
//Searching for value to remove
public void removeSearch(int value)
{
RedBlackNode rt = root;
while (rt != sentinel)
{
int compare = value.CompareTo(rt.getItem());
if (compare == 0)
{
if (rt.getLeft() == sentinel || rt.getRight() == sentinel)
{
removeNode(rt);
}
else
{
RedBlackNode successor = inOrderSuccessor(rt);
rt.setItem(successor.getItem());
removeNode(rt);
}
return;
}
else
{
rt = rt.getChild(compare);
//return true;
}
}
}
protected RedBlackNode inOrderSuccessor(RedBlackNode node)
{
RedBlackNode descendant = node.getRight();
while (descendant.getLeft() != sentinel)
{
descendant = descendant.getLeft();
}
return descendant;
}
protected void removeNode(RedBlackNode remove)
{
count -= 1;
RedBlackNode child;
if (remove.getLeft() != sentinel)
{
child = remove.getLeft();
}
else
{
child = remove.getRight();
}
linkParentAndChild(remove.getParent(), child, comparison(remove, remove.getParent()));
if(remove==root)
{
root = child;
}
if(remove.isBlack())
{
DeleteFix(child);
}
}
protected void DeleteFix(RedBlackNode node)
{
while((node!=root)&&(node.isBlack()))
{
RedBlackNode parent = node.getParent();
int compare = comparison(node, parent);
RedBlackNode sibling = parent.getChild(-compare);
if(sibling.isRed())
{
sibling.setBlack();
parent.setRed();
rotate(-compare, parent);
sibling = node.getParent().getChild(-compare);
}
if(sibling.hasTwoBlackChildren())
{
sibling.setRed();
node = node.getParent();
}else
{
if(sibling.getChild(-compare).isBlack())
{
sibling.getChild(compare).setBlack();
sibling.setRed();
rotate(compare, sibling);
sibling = parent.getChild(-compare);
}
sibling.setColour(parent.getColour());
parent.setBlack();
sibling.getChild(-compare).setBlack();
rotate(-compare, parent);
node = root;
}
}
node.setBlack();
}
任何帮助都会很棒。谢谢
最佳答案
和我一起过一遍:
if (remove.getLeft() != sentinel)
{
child = remove.getLeft();
}
else
{
child = remove.getRight();
}
linkParentAndChild(remove.getParent(), child, comparison(remove, remove.getParent()));
if(remove==root)
{
root = child;
}
首先,假设remove == root
。然后,假设根的左 child 是 sentinel
。第一个 if 分支评估为 false,执行 else
子句,并且 child
成为右节点。然后,您尝试获取根的父级(大概是 null
但我不知道)并将其链接到正确的节点......我想这最终什么都不做但我没有肯定知道,因为您没有提供该方法。然后,您将根替换为 child
,这是正确的节点,因为 linkParentAndChild
被(大概)传入了 null
,所以没有办法恢复左节点,所以你破坏它然后它就消失了。如果左侧节点不是 sentinel
,则过程完全相同,但您将保留左侧而不是右侧。
希望这能弄清楚为什么会发生这种情况。我不会告诉你如何解决它,原因有二:
祝你好运!
关于c# - 根的红黑树删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36584978/
我正在实现红黑 SOR 的并行版本。 我想获得每个进程的最大误差的 MPI_Allreduce 部分不起作用。它永远不会改变,即使只有一个过程,它也会给出高于 2.0 的值。怎么回事?? 这是代码,有
我为拉普拉斯方程(一个简单的加热板问题)在我的红黑 Gauss-Seidel 求解器中添加了 OpenACC 指令,但是 GPU 加速的代码并不比 CPU 快,即使对于大问题也是如此。 我还编写了一个
我是一名优秀的程序员,十分优秀!