我目前正在编写一个从二叉搜索树中删除给定值的方法。但是,当我调用它时,它会删除所述值,但随后会复制其他所有值。我不知道为什么。请告诉我有什么问题。 有两种方法,一种是查找元素,另一种是删除元素。 这是找到该元素的那个......
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;
}
提前致谢!
答案 0 :(得分:0)
...它会删除所述值,但会复制其他所有值。我不知道为什么。请告诉我有什么问题。
这是因为您要从deleteNode()
返回已删除的节点,而在第一种方法delete()
中,您对setRight()
和setLeft()
的调用会将每个遍历的元素设置为删除的元素作为递归展开备份树。