[英]Delete from Binary Search Tree in Java
我找不到删除算法出了什么问题。 当我在BST的根目录上运行delete方法时,它将用正确的子树的最小值替换根目录,但此后不会删除该节点。
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为底的4到1的整数的BST,我的inorderPrint()输出将产生
1,2,3,5,5,6,7,8,9
代替
1,2,3,5,6,7,8,9
用正确的节点更新已删除节点的父节点的指针。 您需要摆脱已删除节点的任何痕迹。 有一个临时节点来跟踪父节点,因此一旦找到要删除的节点,此操作就更容易进行。
当您设置node = node.getLeftChild();
(或node = node.getRightChild();
您将更改局部变量node
的值,而不是更改父节点对此节点的引用)。
您缺少诸如: node.father.left = ....
(或node.father.right = ...
)之类的东西。
您应该更改树本身中的值,而不只是更改方法中持有的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.