我找不到删除算法有什么问题。当我在BST的根目录上运行我的删除方法时,它将使用右子树的最小值替换root,但之后不会删除该节点。
public void delete(BinaryTreeNode node, int x){
if (node==null)
return;
else if (x<node.getKey())
delete(node.getLeftChild(),x);
else if (x>node.getKey())
delete(node.getRightChild(),x);
else{
if (node.getLeftChild()==null)
node = node.getRightChild();
else if (node.getRightChild()==null)
node = node.getLeftChild();
else{
BinaryTreeNode temp = findMin(node.getRightChild());
System.out.println(temp.getKey() + " " + node.getKey());
node.setKey(temp.getKey());
System.out.println(temp.getKey() + " " + node.getKey());
delete(node.getRightChild(), node.getKey());
}
}
}
和我的findMin()方法:
public BinaryTreeNode findMin(BinaryTreeNode node){
if (node.getLeftChild()==null)
return node;
else
return findMin(node.getLeftChild());
}
对于包含所有整数1-9且根为4的BST,我的inorderPrint()输出产生
1,2,3,5,5,6,7,8,9
而不是
1,2,3,5,6,7,8,9
答案 0 :(得分:2)
使用正确的节点更新已删除节点的父指针。您需要删除已删除节点的任何痕迹。有一个临时节点来跟踪父节点,所以一旦找到要删除的节点,这就更容易了。
答案 1 :(得分:1)
当您设置node = node.getLeftChild();
(或对称node = node.getRightChild();
时,您正在更改局部变量node
的值,而不是父亲对此节点的引用。
您遗失的内容有:node.father.left = ....
(或node.father.right = ...
)。
您应该更改树本身的值,而不仅仅是方法中的参考值。