Data structures 比较堆和树/

Data structures 比较堆和树/,data-structures,tree,heap,Data Structures,Tree,Heap,我是数据结构方面的新手 所以我问自己堆和树有什么不同 我还在许多文档中看到,堆是由数组实现的,而树是由POniter实现的。是这样吗 当我们需要使用树或堆时?计算机科学中的树是一种抽象数据类型,表示树结构。根节点可以由子节点组成,其中每个子节点也是树 请注意,并非所有树都是二进制搜索树。二叉搜索树是具有两个定义属性的树: 每个节点最多有2个子节点 左边的子对象小于父对象 正确的子项大于父项 另一种特殊的树是堆。堆是特殊的,因为它具有以下属性: 树中的每个节点始终小于或等于每个子节点 现在

我是数据结构方面的新手

所以我问自己堆和树有什么不同

我还在许多文档中看到,堆是由数组实现的,而树是由POniter实现的。是这样吗


当我们需要使用树或堆时?

计算机科学中的树是一种抽象数据类型,表示树结构。根节点可以由子节点组成,其中每个子节点也是树

请注意,并非所有树都是二进制搜索树。二叉搜索树是具有两个定义属性的树:

  • 每个节点最多有2个子节点

  • 左边的子对象小于父对象

  • 正确的子项大于父项

另一种特殊的树是堆。堆是特殊的,因为它具有以下属性:

  • 树中的每个节点始终小于或等于每个子节点
现在,如何选择实现树取决于您。树可以通过指针/引用实现;节点存储值和指向其子节点的指针/引用

树也可以实现为数组。父项位于索引0处。如果最多有
d
子级,则索引
k
处父级的
i
th子级位于索引
d*k+i
。在其他条件相同的情况下,我们希望使用数组,因为与遍历指针相比,数组速度非常快

然而,二进制搜索树通常使用指针实现。这是因为两个原因

  • 如果这是一个数组,它将始终必须为最坏的情况分配足够的空间。换句话说,如果二进制搜索树的高度为
    h
    ,则数组的大小必须为
    O(2^h)
    。这是不好的,因为您的树只能由
    h
    元素组成

  • 删除也非常耗时。如果删除根节点,则必须向上移动整个子树以替换它。我们之所以要使用二叉搜索树,首先是为了保证
    O(logn)
    操作,这是数组无法实现的


  • 另一方面,堆通常实现为一个数组,因为它的树总是完全平衡的(每个节点都有
    d
    子节点,除了可能在叶子上),这意味着浪费的空间很少,因此我们不必担心1)。此外,对堆的删除不会像二进制搜索树那样严重影响树的结构,因此2)也不适用

    堆是完全二叉树的一种特殊情况,其中一个特定节点要么大于它的两个子节点,要么小于它的子节点

    有两种堆:

    最小堆:在此堆中,任何给定节点都将小于或等于其两个子节点。 最大堆:任何给定节点都将大于或等于其两个子节点

    应用程序:

    排序:提供最佳排序复杂性,即nlogn,并在不使用额外空间的情况下就地执行。 用于计算运行中位数。 用于设置优先级队列。

    d元堆通常作为数组实现。还有许多其他类型的堆,其中大多数不适合数组实现。