使用二叉搜索树来解决什么类问题?

时间:2011-07-05 02:54:13

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

我已经看到这个数据结构谈了很多,但我不清楚什么样的问题需要这样的数据结构(通过替代表示)。我从来不需要一个,但也许那是因为我不太喜欢它。 你能开导我吗?

3 个答案:

答案 0 :(得分:5)

您将使用二叉搜索树的一个示例是您希望能够快速添加元素的值的排序列表。

考虑为此目的使用数组。您可以非常快速地访问读取随机值,但是如果要添加新值,则必须在数组中找到它所属的位置,将所有内容移位,然后插入新值。

使用二叉搜索树,您只需遍历树,查找树已经在树中的值,然后将其添加到那里。

另外,请考虑是否要查明排序后的数组是否包含特定值。您必须从数组的一端开始,并将您要查找的值与每个单独的值进行比较,直到您找到数组中的值,或者传递它本来的位置。使用二叉搜索树,您可以大大减少可能需要进行的比较次数。然而,只是一个快速的警告,绝对有可能设想二进制搜索树需要更多比较的情况,但这些是例外,而不是规则。

答案 1 :(得分:5)

过去我曾经使用过的一件事是霍夫曼解码(或任何可变比特长度方案)。

如果您使用叶子上的字符维护二进制树,则每个传入位决定您是移动到左侧还是右侧节点。

当你到达一个叶子节点时,你有解码的角色,你可以从下一个开始。

例如,请考虑以下树:

    .
   / \
  .   C
 / \
A   B

这将是一个文件的树,其中主要字母为C(通过使用较少的位用于公共字母,文件比固定位长方案的文件短)。各个字母的代码是:

A: 00 (left, left).
B: 01 (left, right).
C: 1  (right).

您使用的问题的是那些您希望能够合理有效地插入和访问元素的问题。除了不平衡的树(例如上面的Huffman示例),您还可以使用平衡树,这使得插入成本更高(因为您可能必须在运行中重新平衡)但是查找因为你正在遍历尽可能少的节点,所以效率更高。

答案 2 :(得分:2)

来自wiki的

自平衡二进制搜索树可以以自然的方式用于构造和维护有序列表,例如优先级队列。它们也可以用于关联数组;只需插入基于密钥的排序即可插入键值对。在这种能力下,自平衡BST与其主要竞争对手哈希表相比具有许多优点和缺点。自平衡BST的一个优点是它们允许按键顺序快速(实际上,渐近最优)枚举项,这些哈希表不提供。一个缺点是当可能存在具有相同密钥的多个项时,它们的查找算法变得更复杂。

自平衡BST可用于实现任何需要可变有序列表的算法,以实现最佳的最坏情况渐近性能。例如,如果使用自平衡BST实现二叉树排序,我们有一个非常简单的描述但渐近最优的O(n log n)排序算法。类似地,计算几何中的许多算法利用自平衡BST的变化来有效地解决诸如线段交叉问题和点位置问题之类的问题。 (但是,对于平均情况性能,自平衡BST可能效率低于其他解决方案。特别是二叉树排序可能比mergesort或quicksort慢,因为树平衡开销以及缓存访问图案。)

自平衡BST是灵活的数据结构,因为它可以很容易地扩展它们以有效地记录附加信息或执行新操作。例如,可以记录每个具有特定属性的子树中的节点数,从而允许在O(log n)时间内计算具有该属性的特定键范围中的节点数。例如,可以使用这些扩展来优化数据库查询或其他列表处理算法。