在二叉搜索树中实现删除节点

时间:2013-04-27 15:16:20

标签: java binary-search-tree

尝试从BST删除节点。执行后,节点仍然存在于树中。我该如何正确实施?

public void deleteNode(TreeNode removeNode, TreeNode root)
{


    if(removeNode.Left==null && removeNode.Right==null) //0 children
    {
        removeNode = null;
    }
    else if(removeNode.Left==null)//1 children
    {

        removeNode = removeNode.Right;
    }
    else if(removeNode.Right==null)//1 children
    {
        removeNode = removeNode.Left;
    }
    else // 2 children
    {
        int successorValue = this.getSuccessor(removeNode, root);
        TreeNode successor = this.search(successorValue,root);

        removeNode.data = successor.data;

        deleteNode(successor, root);
    }

}

1 个答案:

答案 0 :(得分:5)

节点仍然存在,因为您永远不会从树中删除它。

当您致电deleteNode时,您会获得要删除的节点的引用以及树的根目录。当您说removeNode = null;时,您将引用设置为null,则不会删除该对象。这意味着树中的节点仍然引用该节点。

要从树中删除节点,您需要删除对节点的引用。我现在没有你可用的方法,但是为了向你发送正确的方向它应该是这样的:

public void deleteNode(TreeNode removeNode, TreeNode root)
{
    TreeNode parent = removeNode.getParent();   //Find parent node to removeNode.

    if(removeNode.Left==null && removeNode.Right==null) //0 children
    {
        if(parent.Left.equals(removeNode))
             parent.Left = null;                //Set the parents reference to null. 
        else
             parent.Right = null;
    }
    else if(removeNode.Left==null)//1 child
    {
        if(parent.Left.equals(removeNode))
             parent.Left = removeNode.Right;  //Reassign the parents reference to the correct node. 
        else
             parent.Right = removeNode.Right;
    }
    ... //etc.

关键是您必须更改树中的引用而不是本地引用。希望这是有道理的。