从二进制搜索树中删除节点

时间:2013-04-13 06:51:59

标签: java binary-tree

http://www.cs.arizona.edu/~mercer/Projects/BSTRemoveGeneric.pdf

我在编码时遇到问题! 我不知道为什么这不起作用!它让我疯狂!!!! 删除OrderedSet的方法。 这是我的代码

public boolean remove(E element)
{
    if(root == null)
    {
        return false;
    }
    if(!contains(element))
    {
        return false;
    }
    else if(root.data.equals(element) && root.left != null)
    {
        root = root.left;
        return true;
    }
    //return remove(element, root);
    else
    {
        TreeNode curr = root;
        TreeNode prev = root;
        while(element.compareTo(curr.data) != 0 && curr != null)
        {
           prev = curr;
           if(element.compareTo(curr.data) < 0)
           {
                curr = curr.left;
           }
           else// if(element.compareTo(curr.data) > 0)
           {
                curr = curr.right;
           }
        }
        if(curr.left == null)
        {
            if(curr == prev.left)
            {
                prev.left = curr.right;
            }
            else// if(curr == prev.right)
            {
                prev.right = curr.right;
            }
            return true;
        }


        else// if(curr.left != null)
        {
            OrderedSet<E> temp = new OrderedSet<E>();
            temp.root = curr.left;
            System.out.println("\n\n\n\n" + curr.data +  "\n" + prev.data +  "\n" + temp.toStringInorder() + "\n" + temp.max() + "\n\n\n\n");
            curr.data = temp.max();
            TreeNode ref = curr;
            while(curr.right != null)
            {
                ref = curr;
                curr = curr.right;
            }
            ref = ref.left;
            return true;
        }
    }

错误:

插入G A D C后删除(“G”)后失败

呼叫十字路口后尺寸不合格。

根节点离开子节点时无法删除根节点(

当两者都有三个相同的元素

时交叉失败

无法删除root,右侧有更多

插入后删除失败(“M”);插入( “G”);除去( “M”);

你使用的是'=='而不是'equals'吗?插入后删除失败(new Integer(50)); insert(new Integer(75)); remove(new Integer(50));

删除期间失败的大小(2次出现)

(显示9个提示中只有8个)

1 个答案:

答案 0 :(得分:0)

您确定要拥有以下

f(!contains(element))
{
    return false;
}

考虑你要删除的元素存在于树中的情况,这意味着你正在进行额外的计算。

Here's我很久以前写过的一些代码。警告:它非常长 - 大部分都是多余的。