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

希普vs二叉查找树(当它比另一个更好?)

葛海阳
2023-03-14

在什么情况下使用最小堆比使用二叉搜索树更有效?在二叉搜索树中查找最小值的时间是否等于在最小堆 - O(1) 中查找最小值?

共有2个答案

轩辕翰
2023-03-14

两者有不同的用途,不能互换。

堆是一种结构,可保证给定节点的值低于或等于下任何节点的值(对于最小堆;大于或等于最大堆)。这允许在 O(1) 中获取最小(或最大)值。

二进制搜索树是保持所有节点有序的结构。这允许检索O(h)中的任何值(h是树的高度,如果树是平衡的,h=log2(n),n是节点数)。

相弘方
2023-03-14

这几乎就像比较咖啡杯和考拉熊。堆和二进制搜索树旨在执行非常不同的功能。堆是优先级队列抽象数据类型的实现。在基本层面上,优先级队列(也就是堆)只是你放东西的一个袋子,当你伸手去拿一个东西时,你总是会得到袋子里最小(最小堆)或最大(最大堆)的东西。

您可以想象一下,让堆能够删除任意项,或者更改堆中某个项的优先级,但这些都是更高级的html" target="_blank">功能,不属于堆数据结构的传统定义的范围。

二叉查找树是一个完全不同的野兽。这是一个你放东西的袋子,你可以快速伸手按键抓取任何物品,或者你可以按顺序(或相反的顺序)列出所有物品。

您可以使用二叉查找树来实现优先级队列,这意味着原则上您可以用二叉树来代替堆。二叉查找树的性能不如堆,但它可以完成任务。

但是反过来就不是这样了。你不能用堆来代替二叉查找树。

所以哪个更好的问题实际上是一个你想做什么的问题?

如果您想要一组有序的项目,您可以从中快速找到任何项目,或者您可以按顺序遍历,那么您需要一个二进制搜索树。

如果你想要优先级队列抽象数据类型的实现:一个包,当你请求它时,它会快速给你最小(或最大,取决于你如何定义它)项目,那么你需要使用堆。

 类似资料:
  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个

  • 接受的答案可以做一棵完美的树(这也是一棵完整的树)。虽然它不能在没有完美的情况下做成一棵完整的树。不过,这是我的要求最接近的答案。为了在不完美的情况下进行竞争,你可以去掉树最右边的叶子。 1.问题: 试图将< code >二叉查找树变成< code >完整的二叉查找树。我可以找到很多< code >完全二叉树的代码示例,但是没有< code >完全二叉查找树。这个插件的工作就像二叉查找树应该做的那

  • 我们已经看到了两种不同的方法来获取集合中的键值对。回想一下,这些集合实现了 map 抽象数据类型。我们讨论的 map ADT 的两个实现是在列表和哈希表上的二分搜索。在本节中,我们将研究二叉查找树作为从键映射到值的另一种方法。 在这种情况下,我们对树中项的确切位置不感兴趣,但我们有兴趣使用二叉树结构来提供高效的搜索。

  • 在包含 main 函数的类中,定义一个函数调用 createTree(String strKey)。给出一个整数字符串(用空格字符分隔),此函数将创建一个 BST 树,其中整数键跟在输入字符串之后。示例:给定一个字符串 s = “30 20 40”。调用函数 createTree(s) 来创建二叉搜索树:root = 30,root.left = 20,root.right = 40。以下是我的代

  • 我正在尝试用单词构建二叉搜索树。然而,当我使用上面的代码时,我只能访问我的根,根的左、右子项似乎为空。 法典: