1.概述

在本教程中,我们将介绍堆和二叉搜索树(BST)数据结构的主要概念。同时,我们将展示它们的相似之处和不同之处。此外,我们还将讨论它们的内部实现和这些数据结雷竞技app官网网站构上操作的时间复杂性。我们用a大0符号。我们假设对。有基本的了解二叉搜索树数据结构。

2.二叉搜索树

二叉搜索树通常表示为一个无圈图。树由节点组成。如果树是二叉树,每个节点最多有两个子节点。BST有一个重要的属性:每个节点的值严格大于其左子节点的值,并严格小于其右子节点的值。这意味着,我们可以按顺序遍历BST的所有值。此外,这种数据结构不允许重复值。

让我们来看看二元树的示例:

左边的树是一棵二叉树,因为每个节点有0、1或2个子节点。但是,这不是BST。例如,根结点的右子结点是2。2小于根结点15的值。此外,对于值为2的节点,其左子节点的值为17,这也违反了BST属性。上面图片上的其他两棵树是二叉搜索树,因为每个节点都满足BST规则。

二叉搜索树既可以是平衡和不平衡。我们可能会注意到,最后一棵树形成了一个链条,而且是不平衡的。但是,这仍然是一棵二叉搜索树。没有一条规则被违反。但是,插入和删除操作在这样的树中效率很低。

假设n为BST中的节点数。插入和删除操作的最坏情况是O (n)但是,在平衡二元搜索树中,例如,在AVL或RED-Black树中,此类操作的时间复杂性是O (log (n))另一个主要的事实是建立BSTn节点需要O(n * log(n))时间。我们必须插入一个节点n时间和每次插入成本O (log (n))。二进制搜索树的大优势是我们可以遍历树并以排序的顺序获取我们的所有值O (n)时间。

3.堆

堆是一个完整的二叉树。让我们介绍一些定义来理解什么是完全二叉树。

节点是在级别上的k如果这个节点到根节点的距离是k。根的水平为0. k的最大可能数量的节点是2 ^ {k}。在每个完整二叉树的每个级别,它包含最大节点数。但是,除了可能是最后一层,也必须从左到右填充。重要的是要理解,那完全二叉树总是平衡的。

堆不同于二叉搜索树。的BST是一个有序的数据结构,但是,堆不是。在计算机内存中,堆通常表示为一个数字数组。堆可以是最小堆或最大堆。最小堆和最大堆的性质几乎是相同的,但是树的根对于最大堆来说是最大的,对于最小堆来说是最小的。同样的,Max-Heap的主要规则是每个节点下的子树包含的值小于或等于它的根节点。而最小堆则相反。同时,它也意味着堆允许重复

如果堆是一个完整的二叉树,它具有树的最小可能高度,即O (log (n))。在存储堆节点的数组中,索引节点的子节点我是索引处的节点2 * I + 12 * I + 2。这意味着,堆是从上到下填充的。每一层都是从左到右填充的。让我们看一个堆的例子:

左边的堆是最小堆。最小的值有树的根。对于每个节点,它下面的所有值都大于这个节点。右边的树是一个Max-Heap。我们可能会注意到,它有重复的值。然而,这棵树满足所有的Max-Heap属性。这是一个完整树,每个子树都包含小于或等于其根节点的值。

谈到时间复杂性,雷竞技app官网网站我们可以构建一个HeapO(n * log(n))时间。但是,存在一个算法,它允许在堆中构建O (n)时间。插入和移除操作成本O (log (n))但是,堆是无序数据结构。以排序顺序获取其所有元素的唯一可能方法是删除树的根目录n次了。这个算法也被称为堆排序和需要O(n * log(n))时间。

4.堆vs BST

主要的区别是二叉搜索树不允许重复,但是,堆可以。BST是有序的,但堆不是。所以,如果订单很重要,那么最好使用BST。如果顺序不相关,但我们需要确保插入和删除将采取O (log (n))时间,那么堆保证实现这个时间。在二叉搜索树中,这可能需要O (n)时间,如果树完全不平衡(链是最坏的情况)。此外,堆可以在线性时间内构建,然而,BST需要O(n * log(n))要创建。

类实现这些结构PriorityQueueTreeMapPriorityQueue是一个默认的Max-Heap。TreeMap有一个平衡的二叉搜索树作为主干。它的实现是基于红黑树

5.结论

在本文中,我们已经描述了两个常用的数据结构:堆和二进制搜索树。我们谈到了他们的结构和运营雷竞技app官网网站的时间复杂性。此外,我们已经将它们与他们进行了比较并显示了他们的利弊。这些数据结构具有不同的使用区域。因此,选择取决于问题。

2注释
最老的
最新
内联反馈
查看所有评论
阿基里斯
阿基里斯
6个月前

在第二段中有一个错误:BST有一个重要的属性:每个节点的值都严格大于其左子子的值,并且严格大于其正确的孩子的值。
后者应该是“小于”。

Loredana Crusoveanu
Loredana Crusoveanu
6个月前
回复阿基里斯

谢谢,我们已经修改了句子。

评论在本文上关闭!