堆的建立,插入,刪除

2021-08-01 09:06:05 字數 2453 閱讀 4961

堆的概念:如果有乙個關鍵碼的集合k=,把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足:ki <= k2*i +1 且ki<=k2*i + 2; i=0,1,2···,則稱這個堆為最小堆(或者最大堆);其實這麼多乾乾的概念還是很不好理解的;先來說一下什麼是完全二叉樹: 如果一顆具有n個結點的二叉樹的結構與滿二叉樹的前n個結點的結構相同,稱為完全二叉樹;滿二叉樹: 在一顆二叉樹中,如果所有分支結點都存在左子樹和右子樹,並且所有的葉子結點都在同一層上。

從上圖,我們可以很清楚的分別最小堆和最大堆的特點:

最小堆:任一結點的關鍵碼均小於等於它的左右孩子的關鍵碼,位於堆頂結點的關鍵碼最小;

最大堆:任一結點的關鍵碼均大於等於它的左右孩子的關鍵碼,位於堆頂結點的關鍵碼最大;

其實堆的建立就是把所提供給自己的層序遍歷的二叉樹的結果轉化為具有堆特性的二叉樹:

例如:給到這樣乙個陣列:int arr = ;轉化為小堆:

如上圖所示,先從下向上找到第乙個並不為葉子結點的結點(i = (sizeof(a) -2)/2),然後以他為根結點向下調整在左右孩子中找到最小的與之交換,在第①步中,不需要交換; 然後在向前走(i–),繼續以他為根結點,找左右孩子中最小的交換,第②步中,我們就發生了交換;在第③步中,我們以17為根結點交換,但是要保證以他為根結點的所有子樹都滿足最小堆,所以它裡面的所有結點都必須做出調整;最後一步就是把整個樹都調整為最小堆:

這是向下調整的**:

void _adjustdown(size_t parent)

if (compare()(_heap[child], _heap[parent]))

else

return;}}

堆的插入其實就是每次在已經建立好的最小堆或者最大堆的後面插入但是插入之後,有可能會破壞堆的結構,就需要我們對堆進行重新調整以滿足堆的特性:

如上圖所示,最後要達到的結果就是這樣, 我簡單分析一下:其實就是用插入的元素和它的雙親進行比較如果是要構建小堆,那麼,如果它比雙親小,就用它代替雙親,否則就已經是最小堆了(ps:這是基於堆原來就是小堆的基礎上)

我們把這種調整的方法簡單稱為向上調整法:(插入的結點一直在向上走啊):

void _adjustup(size_t child)

else

return;}}

堆的刪除是:偶從堆中刪除堆頂元素。移除堆頂元素後,用堆的最後乙個結點填補取走的堆頂元素,並將堆的實現元素個數減1,但用最後乙個元素去掉堆頂元素之後有可能破壞堆,因此需要 將堆自頂向下調整,使其滿足最大或最小堆。

如上圖,在調整過後的樹中,並不滿足最小堆,所以需要自頂向下進行調整;其實和建立堆的向下調整是一樣的;

附 堆的完整**:

#pragma once

#include

#include

#include

using

namespace

std;

//模板引數

//仿函式

template

struct less

};template

struct greater

};template

class heap

heap(const t array, size_t size)

int root = (size - 2) >> 1;

for (; root >= 0; --root)

}size_t size()const

bool empty()const

void insert(const t&data)

void remove()

const t& top()const

private:

void _adjustdown(size_t parent)

if (compare()(_heap[child], _heap[parent]))

else

return;}}

void _adjustup(size_t child)

else

return;}}

private:

std::vector

_heap;

};

堆的建立 刪除 插入

我們知道在c語言中也有乙個名字叫做堆,那麼在資料結構中的堆和c語言中的堆一樣嗎?答案是 no c語言中的堆 其實是因為有一堆東西在此放著,所以起名為堆 資料結構的堆 如果有乙個關鍵碼的集合k 把它的所有元素按完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足 ki k2 i 1 且 ki k2 i...

堆的建立,插入,刪除,排序

堆是一種完全二叉樹,有最小堆和最大堆之分,最小堆是指根節點的值一定小於左子樹和右子樹所有元素的值,最大堆則相反 當你從小到大排序時,可以選擇最小堆反之,則選擇最大堆 1.如何建立乙個最小堆呢 由於堆是乙個完全二叉樹,所以滿足以下關係 我們將元素的順序從0開始排,第i個節點稱之為ki,那麼元素就有k0...

堆的建立 插入與刪除

堆使用完全二叉樹的結構進行儲存,根據完全二叉樹的性質,在堆中給定下標為i的節點時 如果i 0,節點i是根節點 否則節點i的父節點為節點 i 1 2 如果2i 1 n 1,則節點i無左子女 否則節點i的左子女為2i 1 如果2i 2 n 1,則節點i無右子女 否則節點i的右子女為2i 2 typede...