【问题标题】:Which side do we place a node if it is equal to the parent in a binary search tree在二叉搜索树中,如果它与父节点相等,我们将节点放在哪一边
【发布时间】:2023-03-27 22:29:01
【问题描述】:

我正在学习数据结构和算法。特别是,我正在学习二叉搜索树 (BST)。

正如标题所暗示的那样,我的问题是,如果我们放置一个值,并且它等于它的父级,我们应该放置在哪一侧?左侧是小于父级的值,右侧是大于父级的值。那么,我们在哪里放置一个等于父级的值呢?

感谢您对此的任何帮助。

【问题讨论】:

  • 我们可以在两边插入与父节点值相同的节点。我更喜欢将其插入右侧。
  • 哦,谢谢!

标签: algorithm data-structures binary-search-tree nodes


【解决方案1】:

没有一个普遍认可的标准方法来做到这一点。有些人根本不允许 BST 存储重复项,从而基本上解决了这个问题。 (这是您在将树用于地图和集合时经常看到的)。其他实现可能会将所有相等的键存储在同一个节点中,可能是通过使用链表。其他人可能会说左子树持有较小的键,而右子树持有大于或等于节点自身键的键。

这些方法中的每一种都有优点和缺点,您可以选择最适合您的用例的方法。

【讨论】:

  • 注意:许多具有比较器概念的语言使用默认值operator<,这意味着相等的值被视为较大的值。 (又名:插入右侧)
  • @Mooing Duck,是的,我在代码中注意到了这一点。即使不检查相等的值,它也会将其插入右侧(我使用 Python 3.9.2)
  • @templatetypedef,感谢您细心体贴的解释!
【解决方案2】:

算法只是选择在哪一侧插入与当前节点相同的值。当该选择始终相同时,它当然是最简单的(并且具有成本效益的)。

但是,二叉搜索树只有在保持一定平衡的情况下才能保证对数效率,因此我们还必须考虑重新平衡对具有相同值的节点的位置有什么影响。

例如,如果二叉搜索树是 AVL 树,那么当任何子树的不平衡度大于 1 时,就会发生旋转。

假设我们有一个 AVL 树的算法,当一个值等于当前节点的值时选择右侧。假设我们在一个空树中按顺序插入值 1、1 和 2。然后在第二次插入之后,我们得到:

  1
   \
    1 (insert at right side of root)

然后我们插入2:

  1
   \
    1
     \
      2

现在 AVL 机制执行简单的左旋转,我们最终得到:

  1
 / \
1   2

...现在第二个插入的节点成为根,将原来的根放在它的左边边。

因此,总而言之,当我们谈到一个自平衡二叉搜索树时,即使算法选择一个特定的一侧来插入重复值,也不能保证所有相等的值由于树的重新平衡功能,总是在该边找到

【讨论】:

  • 哇!非常详细且易于理解。谢谢!
  • 很遗憾您删除了接受标记。有什么问题吗?
  • 哦,不,您的回答没有任何问题。只是第一个答案对我来说更容易理解。对不起,如果我造成了任何冒犯。
【解决方案3】:

正如@templatetypedef 所提到的,一种常见的方法是只允许 BST 中的每个值(即键)使用一个节点。对于多集语义(以跟踪密钥出现的次数),在每个节点存储一个计数器就足够了。这种方法简单而高效。

【讨论】:

  • 谢谢!正如@templatetypedef 提到的,这会立即消除问题(或问题)。感谢您花时间回答!
猜你喜欢
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-14
  • 1970-01-01
  • 2021-01-06
  • 2019-01-19
  • 1970-01-01
相关资源
最近更新 更多