尝试从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);
}
}
答案 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.
关键是您必须更改树中的引用而不是本地引用。希望这是有道理的。