Data structures 比较堆和树/
我是数据结构方面的新手 所以我问自己堆和树有什么不同 我还在许多文档中看到,堆是由数组实现的,而树是由POniter实现的。是这样吗Data structures 比较堆和树/,data-structures,tree,heap,Data Structures,Tree,Heap,我是数据结构方面的新手 所以我问自己堆和树有什么不同 我还在许多文档中看到,堆是由数组实现的,而树是由POniter实现的。是这样吗 当我们需要使用树或堆时?计算机科学中的树是一种抽象数据类型,表示树结构。根节点可以由子节点组成,其中每个子节点也是树 请注意,并非所有树都是二进制搜索树。二叉搜索树是具有两个定义属性的树: 每个节点最多有2个子节点 左边的子对象小于父对象 正确的子项大于父项 另一种特殊的树是堆。堆是特殊的,因为它具有以下属性: 树中的每个节点始终小于或等于每个子节点 现在
当我们需要使用树或堆时?计算机科学中的树是一种抽象数据类型,表示树结构。根节点可以由子节点组成,其中每个子节点也是树 请注意,并非所有树都是二进制搜索树。二叉搜索树是具有两个定义属性的树:
- 每个节点最多有2个子节点
- 左边的子对象小于父对象
- 正确的子项大于父项
- 树中的每个节点始终小于或等于每个子节点
d
子级,则索引k
处父级的i
th子级位于索引d*k+i
。在其他条件相同的情况下,我们希望使用数组,因为与遍历指针相比,数组速度非常快
然而,二进制搜索树通常使用指针实现。这是因为两个原因
h
,则数组的大小必须为O(2^h)
。这是不好的,因为您的树只能由h
元素组成O(logn)
操作,这是数组无法实现的另一方面,堆通常实现为一个数组,因为它的树总是完全平衡的(每个节点都有
d
子节点,除了可能在叶子上),这意味着浪费的空间很少,因此我们不必担心1)。此外,对堆的删除不会像二进制搜索树那样严重影响树的结构,因此2)也不适用 堆是完全二叉树的一种特殊情况,其中一个特定节点要么大于它的两个子节点,要么小于它的子节点
有两种堆:
最小堆:在此堆中,任何给定节点都将小于或等于其两个子节点。
最大堆:任何给定节点都将大于或等于其两个子节点
应用程序:
排序:提供最佳排序复杂性,即nlogn,并在不使用额外空间的情况下就地执行。
用于计算运行中位数。
用于设置优先级队列。d元堆通常作为数组实现。还有许多其他类型的堆,其中大多数不适合数组实现。