我正在尝试为二进制树编写isEmpty方法,但我遇到了问题。所以这就是我正在使用的方法。
public boolean isEmpty(){
if(root == null) return true;
else return false;
}
当我只添加一个元素,然后删除这个元素,并调用isEmpty时,我不会得到真,但是假。
我的实施有问题吗?
所以这是删除方法:
/**
* Internal method to remove from a subtree.
* @param x the item to remove.
* @param t the node that roots the tree.
* @return the new root.
* @throws ItemNotFoundException if x is not found.
*/
protected BinaryNode<AnyType> remove( AnyType x, BinaryNode<AnyType> t )
{
if( t == null )
throw new ItemNotFoundException( x.toString( ) );
if( x.compareTo( t.element ) < 0 )
t.left = remove( x, t.left );
else if( x.compareTo( t.element ) > 0 )
t.right = remove( x, t.right );
else if( t.left != null && t.right != null ) // Two children
{
t.element = findMin( t.right ).element;
t.right = removeMin( t.right );
}
else
t = ( t.left != null ) ? t.left : t.right;
return t;
}
这是remove方法使用的removeMin方法:
/**
* Internal method to remove minimum item from a subtree.
* @param t the node that roots the tree.
* @return the new root.
* @throws ItemNotFoundException if t is empty.
*/
protected BinaryNode<AnyType> removeMin( BinaryNode<AnyType> t )
{
if( t == null )
throw new ItemNotFoundException( );
else if( t.left != null )
{
t.left = removeMin( t.left );
return t;
}
else
return t.right;
}
答案 0 :(得分:0)
检查您的删除元素代码。通常比代码找出删除节点的父节点并设置为null对应的引用。对于最后一个元素,它必须设置为null root
变量。
答案 1 :(得分:0)
您的remove(AnyType x, BinaryNode<AnyType> t)
方法使用X元素搜索节点,并使用removeMin
方法(如果有2个子节点)或左侧或右侧子节点将其替换为其中一个子节点。您的公开删除方法可能是这样的:
public boolean remove(AnyType x) {
try {
BinaryNode<AnyType> node = remove(x, root);
if (node != null) {
node = null;
return true;
}
return fal
} catch (Exception e) {
//do something with the exception
return false;
}
}