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;
}