当前位置: 首页 > 知识库问答 >
问题:

二进制搜索树的删除方法

姚星腾
2023-03-14

我正在一个实验室工作,该实验室要求我为二进制搜索树创建一个删除方法。这是我的remove方法的代码。

public void remove(T r)
  {
    remove(root, r);
  }

  private TreeNode <T> remove(TreeNode <T> tree, T r)
  {
    if(tree == null)
    return tree;
    if(r.compareTo(tree.getValue())<0)  // my num is smaller
        tree.setLeft(remove(tree.getLeft(), r));
    else if (r.compareTo(tree.getValue())>0)  // my num is larger
        tree.setRight(remove(tree.getRight(), r));
    else  // this is my number
    {
      if(tree.getLeft() == null && tree.getRight() == null)
      return null;
      else if(tree.getLeft() == null)
      return tree.getRight();
      else if (tree.getRight() == null)
      return tree.getLeft();
    else
    {
      T min = getSmallest(tree.getRight());
      tree.setValue(min);
      //System.out.println("2 + " + toString(tree));
      tree.setRight(remove(tree.getRight(), min));
    }
  }
  return tree;
  }

运行代码时得到的输出是:

移除90后的树。70 80 85 98 100 120

移除70. 80 85 98 100 120后的树

移除85后的树。80 98 100 120

移除98后的树。80 100 120

移除80后的树。100 120

移除120后的树。100

移除100后的树。100

我不知道为什么只有当二叉树中只剩下一个节点时,它才起作用。非常感谢您的帮助。

共有2个答案

裴畅
2023-03-14

如果删除根节点,则还必须更新根节点。

public void remove(T r) {
    root = remove(root, r);
}
鲁波光
2023-03-14

您可能在代码中调用tree.remove(r),它不返回任何内容,也不更改tree,而只更改它的子级或值。解决这个问题的方法是更改

public TreeNode<T> remove(T r)
  {
    return remove(root, r);
  }

和使用

tree = tree.remove(r)

在代码中。要查看代码中发生了什么:我假设您有一个构造函数TreeNode(parent,left,right,value)

TreeNode<Integer> tree = new TreeNode(null,null,null,100);
tree.remove(100);
#remove(100) is called
#remove(root,100) is called
#remove(root,100) returns null after if(tree.getLeft() == null && tree.getRight() == null) without changing anything
#remove(100) returns
 类似资料:
  • 我在C中实现了一个二进制搜索树。 对于delete方法,除了最后一种情况外,其他情况都可以使用,即唯一的树是父树,并且它指向两个空的子树。现在的问题是:我希望在删除子树后,打印出父树的左子树和右子树等于什么。它们和父项都应该为NULL,但是当我试图输出这些值时,我得到了一个状态访问冲突。 下面是有关删除的代码。我希望删除父节点,并设置树- 主要:

  • 我试着删除二叉查找树的节点,当我打印出来的时候,我得到的结果实际上不是这个删除,实际上可以删除二叉树本身的任何键。 我是二进制搜索树的新手。有人能帮我写代码吗?我们将感谢您的帮助。 谢谢 完整代码

  • 目前,我在理解如何在没有传递节点时从二进制搜索树中删除节点时遇到了一个问题。我有两个类,BSTSet和BSTNode,每个类都有一个remove方法。。 当我被传递一个节点时,我理解删除方法,但当我在根上调用remove方法并试图从node类中删除节点时,我不知道从何处开始。有人能告诉我吗?谢谢如果您想了解更多信息,请询问。

  • 我正在尝试为我一直在研究的BST结构实现一个移除方法。以下是包含查找、插入和删除方法的代码: 我被告知可以使用insert方法来帮助我使用remove方法,但我只是不知道如何获取最小/最大的元素,然后用该值替换我正在删除的元素,然后递归地删除我获取替换值的节点,同时仍然保持O(logn)的复杂性。有人有什么想法或明显的漏洞我错过了,或任何其他有帮助的,因为我撞我的头在这个问题上? 编辑:我用答案的

  • 从二叉查找树中删除节点时,您可以将节点替换为左侧的最大子节点或右侧的最小子节点。 我很难理解以下实现执行删除操作的方式。 上面的代码包括以下步骤: < li >查找替换节点。 < li >让替换节点引用已删除节点的左右子节点。 < li >让已删除节点的左右子节点将替换节点作为父节点。 < li >让替换节点引用已删除节点的父节点作为自己的父节点。 < li >清理。 我有困难的部分特别是递归。据

  • 我目前正在做一个学校项目,我必须为二叉搜索树编写一些辅助函数。其中一个函数从树中删除了一个节点。我正在尝试运行一些测试用例,但似乎无法让它们正常工作。我知道这个问题与我如何使用指针有关,但我不太确定我哪里出错了。 这是代码: 注意:我没有包括leftRoot()函数,但它相当简单,我知道它做了它应该做的事情(返回子树中最左边的根)下面是我的教授给我们的测试remove函数的代码部分: 如果有必要,