从二叉搜索树中删除元素

时间:2014-12-15 01:08:19

标签: java

我目前正在编写一个从二叉搜索树中删除给定值的方法。但是,当我调用它时,它会删除所述值,但随后会复制其他所有值。我不知道为什么。请告诉我有什么问题。 有两种方法,一种是查找元素,另一种是删除元素。 这是找到该元素的那个......

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;

这是删除值

的方法
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;
}

提前致谢!

1 个答案:

答案 0 :(得分:0)

  

...它会删除所述值,但会复制其他所有值。我不知道为什么。请告诉我有什么问题。

这是因为您要从deleteNode()返回已删除的节点,而在第一种方法delete()中,您对setRight()setLeft()的调用会将每个遍历的元素设置为删除的元素作为递归展开备份树。