JavaScript 二叉堆

二叉堆是一种特殊的树形数据结构,它满足以下特性:

  • 每个节点的值都大于或等于其子节点的值(最大堆)
  • 或者每个节点的值都小于或等于其子节点的值(最小堆)

二叉堆通常使用数组来实现,这样可以高效地进行插入、删除和查找操作。

二叉堆的基本操作

插入元素

插入元素时,需要将新元素添加到数组的末尾,然后通过“上浮”操作使其满足堆的性质。具体步骤如下:

  1. 将新元素添加到数组的末尾。
  2. 检查新元素是否违反了堆的性质(例如,在最大堆中,新元素是否大于其父节点)。如果违反,则交换新元素与父节点的位置。
  3. 重复步骤2,直到新元素不再违反堆的性质。

删除元素

删除元素时,通常删除的是堆顶元素(根节点),然后将最后一个元素移动到根节点位置,并通过“下沉”操作使其满足堆的性质。具体步骤如下:

  1. 将最后一个元素移动到根节点位置。
  2. 检查当前根节点是否违反了堆的性质(例如,在最大堆中,根节点是否小于其子节点)。如果违反,则与较大的子节点交换位置。
  3. 重复步骤2,直到当前根节点不再违反堆的性质。

构建堆

构建一个堆的过程可以从一个无序数组开始。构建堆的基本思想是将数组中的每个元素依次插入到堆中。具体步骤如下:

  1. 初始化一个空的堆。
  2. 遍历数组中的每个元素,并将其插入到堆中。

另一种更高效的构建堆的方法是从最后一个非叶子节点开始,依次执行下沉操作。这样可以在 O(n) 时间复杂度内完成堆的构建。

二叉堆的实现

下面是一个简单的 JavaScript 实现二叉堆的代码示例:

-- -------------------- ---- -------
----- ---------- -
    ---------------------- - --- -- -- - - -- -
        --------- - ---
        --------------- - -----------
    -

    -- ----
    ------------- -
        ----------------------
        ------------------------------ - ---
    -

    -- ----
    --------------- -
        ----- ------ - -- -
            ----- ----------- - ----------------- - -- - ---
            -- ----------------------------------------- ------------------ -
                ------------------------ ----------------- - ------------------ ------------------------
                ----- - ------------
            - ---- -
                ------
            -
        -
    -

    -- ----
    --------- -
        ----- ----- - -------------
        ----- --------- - ----------------
        -- ----------------- - -- -
            ------------ - ----------
            -----------------
        -
        ------ ------
    -

    -- ----
    --------------- -
        ----- ------ - -----------------
        ----- ------- - -----------------

        ----- ------ -
            --- ----------- - - - ----- - --
            --- ----------- - - - ----- - --
            --- ---- - -----

            -- ------------ - ------- -
                -- ------------------------- ------------------------ -
                    ---- - ------------
                -
            -

            -- ------------ - ------- -
                -- -
                    ----- --- ---- -- ------------------------ ------------------------ --
                    ----- --- ---- -- --------------------------------------- ------------------------
                - -
                    ---- - ------------
                -
            -

            -- ----- --- ----- ------
            ------------------ ---------------- - ----------------- ------------------
            ----- - -----
        -
    -

    -- ---
    ---------------- -
        --------- - --------------
        --- ---- - - --------------------------- - --- - -- -- ---- -
            -----------------
        -
    -
-

-- --------
----- ------- - --- -------------- -- -- - - ---
------------------
------------------
------------------
------------------

-------------------------- -- --- --- -- -- --

-- --------
----- ------- - --- -------------- -- -- - - ---
------------------
------------------
------------------
------------------

-------------------------- -- --- --- -- -- --

以上代码展示了如何使用 JavaScript 实现一个通用的二叉堆类,并提供了插入、删除、构建等基本操作。可以根据实际需求调整比较函数来实现最大堆或最小堆。

纠错
反馈