繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM