我是数据结构的新手。
所以我问myselft堆和树有什么不同?
我还在许多文档中看到堆由数组实现,而tree是poniters。是吗?
当我们需要使用树或堆时?
答案 0 :(得分:1)
计算机科学中的树是表示树结构的抽象数据类型。根节点可以由子节点组成,其中每个子节点也是树。
请注意,并非所有树都是二叉搜索树。二叉搜索树是一个具有2个定义属性的树:
每个节点最多有2个孩子
左孩子少于父母
正确的孩子大于父母
另一种特殊的树是堆。堆是特殊的,因为它具有以下属性:
现在,您如何选择实施树取决于您。树可以通过指针/引用实现;节点存储值及其子节点的指针/引用。
树也可以实现为数组。父项位于索引0.如果最多有d
个子项,则索引为i
的父项的k
子项位于索引d*k+i
。在其他条件相同的情况下,我们希望使用数组,因为与遍历指针相比,数组非常快。
但是,二进制搜索树通常使用指针实现。这是因为两个原因。
如果这是一个数组,它总是必须为最坏的情况分配足够的空间。换句话说,如果您的二叉搜索树的高度为h
,则您的数组的大小必须为O(2^h)
。这很糟糕,因为您的树只能包含h
元素。
删除也非常耗时。如果删除根节点,则必须将整个子树移位以替换它。我们首先想要使用二叉搜索树的原因是为了保证O(log n)
操作,我们不会使用数组。
一方面,堆通常被实现为一个数组,因为它的树总是完全平衡的(每个节点都有d
个孩子,除了可能在叶子上)这意味着浪费的空间非常少所以我们赢了不必担心1)。此外,删除堆不会像二叉搜索树那样大大影响树的结构,因此2)也不适用。
答案 1 :(得分:0)
堆是完全二叉树的一种特殊情况,其中特定节点要么大于其两个子节点,要么小于其子节点。
堆有2种:
最小堆:在此堆中,任何给定节点均小于或等于其两个子节点。 最大堆:任何给定的节点都将大于或等于其两个子节点。
应用程序:
排序:提供最佳的排序复杂性,即。 nlogn并就地执行它,即。无需使用额外的空间。 用于计算运行中值。 用于设置优先级队列。