我需要删除二进制搜索树的最小值,但我找不到干净的方法来做到这一点,目前我有一些干净的代码,尽管它没有像我期望的那样工作工作,我得到了这个代码(MTE得到了MTE,MTE正确和int val键):
MTE tempElement = root;
if(root == null) return;
else if((root.left == null) && (root.right == null))
{
root = null;
return;
}
else if(root.left != null)
{
while(tempElement.left != null) tempElement = tempElement.left;
if(tempElement.right == null) tempElement = null;
else tempElement = tempElement.right;
}
else if(root.right != null)
{
if(tempElement.left == null) root = tempElement;
else
{
while(tempElement.left != null) tempElement = tempElement.left;
root.val = tempElement.val;
if(tempElement.right == null) tempElement = null;
else tempElement = tempElement.right;
}
}
我使用此代码时遇到的问题是当我到达这行代码时 - if(tempElement.right == null) tempElement = null;
这是我提供的代码段的第13行。当我调试它时,它将tempElement更改为null,但我的主要根元素不会更改其任何节点 - 我希望它的工作方式,任何解决方法?
答案 0 :(得分:3)
您应该保持指向父节点的指针,然后更改父节点的左或右指针,例如
if(root.left != null)
{
MTE prev = tempElement;
while(tempElement.left != null) {
prev = tempElement;
tempElement = tempElement.left;
}
if(tempElement.right == null) prev.left = null;
else prev.left = tempElement.right;
}
需要为正确做同样的事情!= null。
答案 1 :(得分:0)
您的left
和right
字段是参考变量。他们可以保存对象的引用。
您的变量tempElement
是一个局部变量。最初它拥有对象的引用的副本。 它不包含对其值进行复制的字段的引用。当您将该局部变量设置为null时,就会发生这种情况。
如果要将对象中的字段设置为null,则必须分配给该字段 - 不要分配给碰巧保存对同一对象的引用副本的本地变量。例如,这会将字段设置为null:
tempElement.left = null;