日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【模板】堆的结构

發布時間:2024/4/19 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【模板】堆的结构 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這里是最小堆,最大堆也是類似的。

1.堆是一顆完全二叉樹。

性質:子節點的值一定不小于父節點的值。

堆的存儲用一個數組heap[n]即可。

由于完全二叉樹的性質,節點是按順序排列的,

i 節點的子節點編號為 2i+1 和 2i+2 。

同理 i 節點的父節點為 (i-1)/2 。

操作:堆有插入和刪除兩種操作,由于是二叉樹,兩種操作都是O(logn) 的 。

實現C++代碼:

#include <bits\stdc++.h> using namespace std; #define MAX_N 1000int heap[MAX_N],sz = 0;void push(int x){//新加入節點的編號 int i = sz++;while(i > 0){//父節點 int p = (i-1)/2;//如果新加節點小于它的父節點,則退出 if(heap[p] <= x) break;//把父節點放下來 heap[i] = heap[p];//把自己提上去 i = p;}//循環退出的時候已經找到了該放的位置 // 把新節點加入進來 heap[i] = x; }int pop(){//有值才能pop assert(sz > 0);//要刪除的元素 int ret = heap[0];//記錄最后一個節點的值 int x = heap[--sz];//找到最后一個節點該待的位置,因為最后一個節點已經被刪除了 int i = 0;//如果有子節點就循環 while(i * 2 + 1 < sz){//找到較小的子節點 int a = i*2+1;int b = i*2+2;if(b < sz&&heap[b] < heap[a]) a = b;//如果較小的子節點大于最后一個節點的值則退出,因為已經找到了最后一個節點該待的位置 if(heap[a] >= x) break;//把子節點提上來 heap[i] = heap[a]; //進入子節點 i = a; }//把最后一個節點放到它該待的位置 heap[i] = x;return ret; } int main(){}

總結

以上是生活随笔為你收集整理的【模板】堆的结构的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。