【问题标题】:Why are Binary Search Trees (BST) created using a node data structure instead of arrays?为什么使用节点数据结构而不是数组创建二叉搜索树 (BST)?
【发布时间】:2015-01-25 09:51:36
【问题描述】:

我见过的大多数 BST 的例子都是这种形式

Class Node {
    Node left;
    Node right;
    Key key;
    Value value;
 }

但是 BSTs 看起来像是一种特殊形式的二叉堆,有一个额外的约束,即左子值应该小于父值,父值应该小于右节点值。

使用数组很容易实现二进制堆。为什么不使用数组创建 BST 以确保维护这个额外的规则?这样做有什么坏处?

【问题讨论】:

  • 人们确实使用数组来实现 BST。

标签: binary-search-tree binary-heap


【解决方案1】:

答案很简单:不能只动态更改数组的大小。

数组的大小不能在之后更改。如果您要使用数组,则必须根据添加或删除的内容来放大或缩小它,这会导致不必要的开销,因为无论何时您都必须将内容从旧数组复制到新数组。

使用使用引用或指针的节点允许您在删除元素时插入或将其设置为null(或类似的东西)相应地(重新)分配leftright给新元素这为您提供了更加动态的结构。

【讨论】:

  • 在那种情况下二进制堆不会有同样的问题吗?但它们似乎仍然是优先级队列的首选......
  • 我不明白问题是什么?
  • 我只是想知道调整数组大小的问题是否是在 BST 的情况下使用节点结构的唯一原因?换句话说,如果我知道 BST 中只有固定数量的元素(比如少于 100 个),那么数组是实现 BST 而不是节点的好选择?
  • 我可能会错过一些东西,但恕我直言,不使用数组的唯一原因是它带来的不灵活性。假设您有一个包含 100 个元素的数组存储在一个数组中,并且想要添加一个。您必须将整个元素复制到另一个数组中,这意味着您为该复制任务使用的内存是必要的两倍。但是,如果您是例如在嵌入式系统上,您可能希望摆脱节点带来的开销(指向左右的指针等)。如果您知道树的最大大小,您可能希望为此使用数组。
  • 这样的事情总是取决于任务和你为此获得的资源。如您所知,这两种方法都很好并且可以工作 - 节点和数组 - 您只需要分析您的具体问题并做出最适合您要求的选择。
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多