从Java中的二进制搜索树中删除

时间:2014-04-18 20:32:58

标签: java binary-search-tree

我找不到删除算法有什么问题。当我在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

2 个答案:

答案 0 :(得分:2)

使用正确的节点更新已删除节点的父指针。您需要删除已删除节点的任何痕迹。有一个临时节点来跟踪父节点,所以一旦找到要删除的节点,这就更容易了。

答案 1 :(得分:1)

当您设置node = node.getLeftChild();(或对称node = node.getRightChild();时,您正在更改局部变量node的值,而不是父亲对此节点的引用。

您遗失的内容有:node.father.left = ....(或node.father.right = ...)。
您应该更改树本身的值,而不仅仅是方法中的参考值。