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

删除二叉树中节点的方法

慕容聪
2023-03-14

我正在阅读一本书,该书解释了如何从二元搜索树中删除节点,基本上如果我们有这棵树:

       10
      /  \
     4    100
    / \
   1   8
      / \
     6   9
      \
       7

我们想删除节点4,书上说我应该:

  1. 在其右子树(即6)中找到4的继任者
  2. 交换4和6
  3. 从右子树中删除6
  4. 将4的左侧子树(在本例中仅为1)附加到新节点6

因此我们得到

       10
      /  \
     6    100
    / \
   1   8
      / \
     7   9

然而,我想到了另一种方法来做到这一点:

  1. 找到4个右子树的最小元素(即6)
  2. 将4的左子树附加到6(它不会有左子树)
  3. 将父元素(10)附加到4的右侧元素(8)。如果算法是递归的,我们可以返回8

因此我们得到

       10
      /  \
     8    100
    / \
   6   9
  / \
 1   7

现在我想问:我看到我的解决方案产生了(至少在这种情况下)一个稍微不平衡的树。

我为什么要用我的书而不是我自己的书呢?似乎我的解决方案更容易实现(至少从我的角度来看),但如果我错了,我更希望其他人指出。

共有2个答案

郦楷
2023-03-14

当您的树不平衡时,遍历树的时间会增加,因此您会失去使用BST的一些好处。

罗兴运
2023-03-14

这两种方法的代码都特别复杂。

您的方法通常会产生一个不太平衡的树,因为您正在获取子树(1的子树)并将其(可能)向下移动很远。

按照他们的方法,7的子树向上移动1个节点,其他子树不移动。

可能只是因为他们没有考虑过你的方法,或者,如果他们考虑过,他们可能会选择自己的方法,因为树越不平衡,对它的查询性能就越差。

虽然这一讨论并不特别重要,因为基本的二元搜索树在实践中很少使用-而是使用自平衡树(由于试图维护某些属性以保持树的平衡,因此可以对此提出更有力的论点)。

 类似资料:
  • 我现在正在读一本关于从二叉搜索树中删除节点的书,书中描述的过程对我来说似乎不必要地复杂。 在1号情况下,如果我们删除40,它将替换为30;在 2 号情况下,如果我们删除 40,它将被替换 35。 但在书中,它说应该从要删除的节点的右子树中找到替换,这可能涉及一些复杂的操作。 我在这里遗漏了什么吗?请指出。

  • 当删除具有两个子节点的节点时,如果指示使用标准的二叉搜索树节点删除算法,我们应该将其替换为右子树的最小节点还是左子树的最大节点?

  • 我的删除方法由4个if语句组成,用于处理二叉查找树中的4种不同类型的删除。不确定哪里错了,但当我检查它时,它没有删除任何节点。如果赞赏,任何帮助。提前感谢' 我怀疑问题在于我试图将节点删除替换为空 }

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

  • class Node(object): def __init__(self, data, left=None, right=None): self.data = data self.left = left self.right = right tree = Node(1, Node(3, Node(7, Node(0)), Node(6)), Node(2, Node

  • 我正在为二元搜索树组装函数,结果遇到了麻烦。我正在研究当需要从树中删除包含指定值的节点时可能遇到的每种情况。如果节点没有左右子节点,我不确定如何处理释放节点。函数必须返回节点。我是否备份、检查每个左、右子级,并在子级中删除该值?但是如果该值在根中,我是否会遇到类似的问题,即如何删除它?作为解释,程序使用一个void指针,然后在一个单独的函数compare()中强制转换类型val,该函数计算两个值并