【问题标题】:Delete from Binary Search Tree in Java从 Java 中的二叉搜索树中删除
【发布时间】:2015-08-30 05:29:01
【问题描述】:

我找不到我的删除算法有什么问题。当我在 BST 的根节点上运行删除方法时,它会将根节点替换为右子树的最小值,但此后不会删除节点。

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

【问题讨论】:

  • 迭代地而不是递归地执行findMin(...) 方法。
  • @Cyber​​neticTwerkGuruOrc 这与问题无关,我怀疑它会被大多数编译器优化,因为这是尾递归。在这种情况下,我发现递归解决方案更具可读性。
  • @amit 显然它与问题无关。这就是为什么我将其发布为评论而不是答案。即使在这种情况下编译器会处理它,OP 也应该学会以递归方式迭代地执行 大多数 方法(除非研究递归)。

标签: java binary-search-tree


【解决方案1】:

使用正确的节点更新已删除节点的父级指针。您需要清除已删除节点的任何痕迹。有一个临时节点来跟踪父节点,因此一旦找到要删除的节点,这样做会更容易。

【讨论】:

    【解决方案2】:

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

    您缺少类似:node.father.left = ....(或node.father.right = ...)的内容。
    您应该更改树本身的值,而不仅仅是您在方法中持有的引用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-28
      • 2019-04-11
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多