将参考对象键设置为null并不按预期工作

时间:2016-11-21 16:45:44

标签: java binary-search-tree

我需要删除二进制搜索树的最小值,但我找不到干净的方法来做到这一点,目前我有一些干净的代码,尽管它没有像我期望的那样工作工作,我得到了这个代码(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,但我的主要根元素不会更改其任何节点 - 我希望它的工作方式,任何解决方法?

2 个答案:

答案 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)

您的leftright字段是参考变量。他们可以保存对象的引用。

您的变量tempElement是一个局部变量。最初它拥有对象的引用的副本。 它不包含对其值进行复制的字段的引用。当您将该局部变量设置为null时,就会发生这种情况。

如果要将对象中的字段设置为null,则必须分配给该字段 - 不要分配给碰巧保存对同一对象的引用副本的本地变量。例如,这会将字段设置为null:

tempElement.left = null;