Java 从二叉搜索树中删除元素
我目前正在编写一个方法,从二进制搜索树中删除给定的值。但是,当我调用它时,它会删除所述值,但会复制其他所有值。我不知道为什么。请告诉我怎么了。 有两种方法,一种是查找元素,另一种是删除元素。 这是一个找到该元素的元素Java 从二叉搜索树中删除元素,java,Java,我目前正在编写一个方法,从二进制搜索树中删除给定的值。但是,当我调用它时,它会删除所述值,但会复制其他所有值。我不知道为什么。请告诉我怎么了。 有两种方法,一种是查找元素,另一种是删除元素。 这是一个找到该元素的元素 public static TreeNode delete(TreeNode t, Comparable x, TreeDisplay display) { if( x.compareTo(t.getValue()) > 0) {
public static TreeNode delete(TreeNode t, Comparable x, TreeDisplay display)
{
if( x.compareTo(t.getValue()) > 0)
{
display.visit(t);
t.setRight(delete( t.getRight(), x, display));
}
else if ( x.compareTo(t.getValue()) < 0)
{
display.visit(t);
t.setLeft(delete(t.getLeft(), x, display));
}
else
{
t = deleteNode(t, display);
}
return t;
提前谢谢
…它删除所述值,然后每隔一个值复制一次。我不知道为什么。请告诉我怎么了
这是因为您正在从
deleteNode()
返回已删除的节点,在第一个方法delete()
中,您对setRight()
和setLeft()的调用
将每个遍历的元素都设置为已删除的元素,因为递归将返回到树中。这类事情是调试器方便使用的地方。您可以逐步检查代码的执行情况,看看它到底做错了什么。同样在deleteNode中,您没有设置要返回的新值。返回t,但t永远不会被修改。e、 g.应该有t=t.getLeft()
在某个地方。马上看起来你不必要地把它弄得太复杂了。找到合适的节点,看起来你知道怎么做。然后,只需删除maxLeft或minRight的节点。看起来这么简单的东西检查和更改太多了。
private static TreeNode deleteNode(TreeNode t, TreeDisplay display)
{
if (t.getRight()!=null)
{
TreeNode right = t.getRight();
TreeNode max = (TreeNode)TreeUtil.leftmost(right);
TreeNode previous = null;
while ( right.getLeft()!=null&&right.getLeft().getLeft()!=null)
{
right = right.getLeft();
}
t.setValue(max.getValue());
if ( max.getRight()==null)
{
right.setLeft(null);
}
else
{
right.setLeft(max.getRight());
}
}
else if (t.getLeft() !=null)
{
TreeNode left = t.getLeft();
TreeNode max = (TreeNode)TreeUtil.rightmost(left);
while(left.getRight()!=null &&left.getRight().getRight()!=null)
{
left = left.getRight();
}
t.setValue(max.getValue());
if ( max.getLeft()==null)
{
left.setRight(null);
}
else
{
left.setRight(max.getLeft());
}
}
else
{
t = null;
}
return t;
}