精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

圖解:什么是二叉堆?

開發 前端
在正式開始學習堆之前,一定要大腦里回顧一下什么是完全二叉樹,因為它和堆可是息息相關奧!

[[339907]]

在正式開始學習堆之前,一定要大腦里回顧一下什么是完全二叉樹,因為它和堆可是息息相關奧!

如果二叉樹中除了葉子結點,每個結點的度都為 2,則此二叉樹稱為滿二叉樹。

而如果二叉樹中除去最后一層節點為滿二叉樹,且最后一層的結點依次從左到右分布,則此二叉樹被稱為完全二叉樹。

 

所以可以滿二叉樹必然是完全二叉樹,關于完全二叉樹不清楚可以查看 一文讀懂有關Tree的前世今生 這篇文章。

 

對于任意一個完全二叉樹來說,如果將含有的結點按照層次從左到右依次標號(如上圖)),對于任意一個結點 i ,完全二叉樹(二叉堆)滿足以下幾個結論:

當i>1時,父親結點為結點 。i/2時,i=1時,表示的是根結點,無父親結點);比如結點 45 的的標號為 4 ,其父結點 15 的標號為 2 ,而2=4/2 ;

如果2Xi >n(總結點的個數) ,則結點 肯定沒有左孩子(為葉子結點);否則其左孩子是結點2Xi 。比如結點 15 的標號為 2 ,其左孩子結點為 4 ;

如果2X+1 >n,則結點i 肯定沒有右孩子;否則右孩子是結點2Xi+1 。

堆堆(Heap)是一類基于完全二叉樹的特殊數據結構。通常將堆分為兩種類型:

  1. 大頂堆(Max Heap):在大頂堆中,根結點的值必須大于它的孩子結點的值,對于二叉樹中所有子樹也應遞歸地滿足這一特性。
  2. 小頂堆(Min Heap):在小頂堆中,根結點的值必須小于它的孩子結點的值,且對于二叉樹的所有子樹也均遞歸地滿足同一特性。

不是所有的人都是計算機出身,上過正課的小伙伴,所以我在嘮叨一下概念。

 

小頂堆就是以任意一個結點作為根,其左右孩子都要大于等于該結點的值,所以整顆樹的根結點一定是樹中值最小的結點,而大頂堆正好特性相反。

二叉堆

二叉堆是滿足下面屬性的一顆二叉樹:

  1. 二叉堆必定是一顆完全二叉樹。二叉堆的此屬性也決定了他們適合存儲在數組當中。
  2. 二叉堆要么是小頂堆,要么是大頂堆。小頂二叉堆中的根結點的值是整棵樹中的最小值,而且二叉樹中的所有頂點及其子樹均滿足這一特性。大頂堆與小頂堆類似,大頂堆的根結點的值是整棵樹中的最大值,而且二叉樹中所有結點的值也均大于等于其子樹結點。

由于小頂堆和大頂堆除了在頂點的大小關系上不一致,兩者均是一顆全完二叉樹,下面的所有講解,都以小頂堆為例進行說明,會了小頂堆,大頂堆你自己都能寫出來。

 

這就是兩個典型的小頂堆。

二叉堆的存儲結構

二叉堆是一顆完全二叉樹,一般用數組表示。其中根元素用 arr[0] 表示,而其他結點(第i 個結點的存儲位置)滿足下表中的特性:

數組表示含義

數組表示 含義
arr[(i-1)/2] 第 i 個結點的父結點
arr[2*i + 1] 第 i 個結點的左孩子結點
arr[2*i + 2] 第 i 個結點的右孩子結點

二叉堆的這種表示方式和性質其本質上與一顆完全二叉樹自身所具有的特性一一對應。

 

小頂二叉堆的常見操作

獲取小頂二叉堆的根元素 getMin() ,這一操作的時間復雜度為 ;按照上面的存儲結構,根結點為 arr[0] ,返回即可。

  1. int getMin() 
  2.     return arr[0]; 

移除小頂二叉堆的最小元素 removeMin() ,這一操作的時間復雜度為 ,因為移除小頂二叉堆的最小元素(即堆頂元素)之后,需要對堆進行調整,從而使得堆依舊維持其屬性,一般將調整的過程稱為 堆化 (heapify)。

  1. int removeMin()  
  2. {  
  3.     if (heap_size <= 0)  
  4.         return INT_MAX;  
  5.     if (heap_size == 1)  
  6.     {  
  7.         heap_size--;  
  8.         return harr[0];  
  9.     }  
  10.    
  11.     // 存儲最小值(當前的堆頂元素),將堆中的最后一個元素放到堆頂,然后進行Heapify() 
  12.     int root = harr[0];  
  13.     harr[0] = harr[heap_size-1];  
  14.     heap_size--;  
  15.     MinHeapify(0);  
  16.    
  17.     return root;  
  18. }  

我們以下圖為例進行說明:

 

刪除堆頂元素 10 ,然后將最后一個元素 50 作為小頂堆的堆頂:

 

然后從堆頂元素 50 開始進行堆化。

第一步:計算當前堆頂元素 50(i = 0) 的左孩子 ,以及右孩子 ,然后比較三者,選擇出三者的最小值 15 ,將 15 和 50 進行交換,繼續對值為 50 的頂點(i = 1)的子樹進行堆化:

 

第二步:計算當前要進行堆化的結點 50(i = 1) 的左右孩子,左孩子 ,右孩子不存在,比較 50 和 45 ,發現 50 > 45 ,交換兩者,然后繼續對值為 50 的頂點(i = 3)的子樹進行堆化:

 

第三步:計算要進行堆化的結點 50 (i = 1) 的左右孩子,發現不存在,所以結點 50 已經到葉子結點,整棵樹堆化完成啦(其實這個堆化的過程還是挺簡單的,我們后面刪除等還會用到堆化的,這里不明白,不影響下面繼續噠!)。

更新給定下標的值 updateKey(int i,int new_val) ,這里有一個假設是 new_val < val 的值,如果 new_val > val ,那么就是對更新的結點進行堆化啦,所以就不單獨進行處理。還想兩種都處理,加個 If...else... 就可以啦。

  1. void updateKey(int i, int new_val)  
  2. {  
  3.     harr[i] = new_val;  
  4.     while (i != 0 && harr[parent(i)] > harr[i])  
  5.     {  
  6.        swap(&harr[i], &harr[parent(i)]);  
  7.        i = parent(i);  
  8.     }  

這個操作和堆化的操作相反,我們是從被更新的結點開始向上回溯,直到結點的值大于父結點的值停止。

 

我們將下標為 4 的結點 50 的值更新為 8 :

 

第一步:判斷結點 8(i = 4) 的父結點的大小關系,8 < 15 ,交換 8和 15 ,然后結點 8(i = 1) 繼續做判斷:

 

第二步:判斷結點 8(i = 1) 與其父節點的大小關系,8 < 10 , 交換8 和10 :

 

第三步:判斷結點 8(i = 0),發現其本身已為根結點,沒有父結點,更新結束。

更新結點值的時間復雜度也為 ,即為樹高。

插入結點 insert() :插入一個新結點的時間復雜度也為 。將一個新結點插入到樹的末尾,如果新結點的值大于其父結點的值,插入就直接完成了;否則,類似于 updateKey() 操作,向上回溯修正堆。

  1. void insert(int k)  
  2. {  
  3.     if (heap_size == capacity)  
  4.     {  
  5.         cout << "\n溢出:無法插入\n";  
  6.         return;  
  7.     }  
  8.    
  9.     // 將新插入的結點插入最后一個位置 heap_size - 1 
  10.     heap_size++;  
  11.     int i = heap_size - 1;  
  12.     harr[i] = k;  
  13.    
  14.     // 如果違反堆的性質,則向上回溯進行修正 
  15.     while (i != 0 && harr[parent(i)] > harr[i])  
  16.     {  
  17.        swap(&harr[i], &harr[parent(i)]);  
  18.        i = parent(i);  
  19.     }  
  20. }  

 

比如,我們插入結點 30(i = 5) ,由于其值大于父結點的值 20 ,并沒有違反堆的屬性,直接插入完成。

 

在插入結點 30 的基礎上,我們再插入結點 9(i = 6) :

 

新插入結點的值 9(i = 6) 小于父結點 20(i = 2) 的值,故交換結點 9 和 20 ,然后繼續判斷值為 9(i = 2) :

 

判斷結點 9(i = 2) 與其結點 10(i = 0) 的值, 9 < 10 ,交換 9 和 10 ,然后繼續判斷值9(i = 2) :

 

發現值 9(i = 2) 已經是根結點了,插入完成。

刪除結點 delete() : 刪除一個結點的時間復雜度也是 。將要刪除的結點用無窮小 INT_MIN 替換,即調用 updateKey(i, INT_MIN) ; 然后再將堆頂元素 INT_MIN 移除,即調用 removeMin() 。

  1. void delete(int i)  
  2. {  
  3.     updateKey(i, INT_MIN);  
  4.     removeMin();  
  5. }  

 

比如,我們刪除結點 15(i = 1) ,第一步,調用 update(1, INT_MIN) 將該結點的值替換為INT_MIN :

 

第二步:調用 removeMin() 函數將 INT_MIN 移除即可。

 

最后再來看一下 removeMin() 函數中提到的堆化操作的實現代碼(結合前面介紹removeMin() 函數時堆化的圖文):

  1. void Heapify(int i) 
  2.     int l = left(i); //結點 i 的左孩子下標 2i + 1 
  3.     int r = right(i); //結點 i 的右孩子小標 2i + 2 
  4.     int samllest = i; 
  5.     if(l < heap_size && arr[l] < arr[i]) 
  6.     { 
  7.      smallest = l;  
  8.     } 
  9.  if(r < heap_size && arr[r] < arr[smallest]) 
  10.     { 
  11.         smallest = r; 
  12.     } 
  13.      
  14.     if(smallist != i) 
  15.     { 
  16.         swap(&arr[i], &arr[smallest]); 
  17.         Heapify(smallest); 
  18.     } 

關于二叉堆的基本操作就介紹完了,因為二叉堆不論在考試還是面試中是最常見的,所以建議一定要搞懂奧!

堆的應用

一、堆排序(Heap Sort):堆排序可以使用二叉堆在 的時間內對數組完成排序,這也是今天先講二叉堆的原因。

二、優先隊列(Priority Queue):使用二叉堆,可以實現一個高效的優先隊列,因為二叉堆的各類操作的時間復雜度均為 。(優先隊列好像我沒講,以后有機會一定更新)

三、圖算法(Graph Algorithms):優先隊列廣泛應用于像迪杰斯特拉算法和普里姆算法的圖算法當中

除了講的二叉堆,還有基于二叉堆的變體,二項式堆、斐波那契堆等等,我們之后有余力了再一起學,現在還是 “功利” 一點兒,搞好我們考試和面試中最重要的二叉堆,周末愉快~~

本文轉載自微信公眾號「景禹」,可以通過以下二維碼關注。轉載本文請聯系景禹公眾號

 

責任編輯:武曉燕 來源: 景禹
相關推薦

2021-03-02 10:57:39

二叉樹二叉堆節點

2021-05-06 05:29:32

二叉堆數據結構算法

2020-11-23 08:53:34

堆Heap

2023-04-06 07:39:48

2020-10-11 16:56:48

二叉搜索樹代碼開發

2020-04-27 07:05:58

二叉樹左子樹右子樹

2020-12-11 09:49:29

二叉樹搜索樹數據

2021-05-09 20:22:41

順序查找二叉查找數據結構

2021-03-17 08:19:22

二叉樹LeetCode

2013-07-15 16:35:55

二叉樹迭代器

2021-09-29 10:19:00

算法平衡二叉樹

2022-12-26 00:51:33

雙向鏈表二叉搜索樹

2021-04-20 08:37:14

數據結構二叉樹

2021-04-19 07:47:42

數據結構二叉樹Tree

2022-04-18 07:01:36

二叉堆大根堆小根堆

2021-04-28 20:12:27

數據結構創建

2020-09-28 06:48:15

HTTP協議版本

2020-08-31 06:41:52

RSA算法

2021-02-14 19:51:04

車聯網5G4G

2020-09-23 18:25:40

算法二叉樹多叉樹
點贊
收藏

51CTO技術棧公眾號

日本www在线视频| 国产精选在线观看91| 欧洲美女女同性互添| 91成人精品在线| 黑人欧美xxxx| 亚洲综合第一| 日韩中文字幕免费观看| 日本少妇一区二区| 欧美多人乱p欧美4p久久| 黄色正能量网站| 北岛玲精品视频在线观看| 亚洲福利视频导航| 亚洲国产欧美一区二区三区不卡| 国内老熟妇对白hdxxxx| 三级成人在线视频| 欧美—级高清免费播放| 欧美性猛交xxxx乱大交少妇| 乱中年女人伦av一区二区| 欧美午夜精品电影| 女人帮男人橹视频播放| 欧美日韩在线看片| www精品美女久久久tv| 999在线观看免费大全电视剧| 日韩在线观看第一页| 亚洲女同中文字幕| 中文字幕欧美国内| 玖玖爱在线精品视频| 精品网站999| 欧美性猛交xxxx乱大交退制版| 亚洲精品无码国产| 午夜影院免费在线| 成人免费在线观看入口| 日韩精品av一区二区三区| 日本xxxx人| 国产成人精品免费看| 91精品美女在线| 国产精品第六页| 国产精品毛片| 韩国福利视频一区| 久久久精品国产sm调教| 亚洲国产老妈| 久久综合伊人77777蜜臀| 五级黄高潮片90分钟视频| 一区中文字幕电影| 日韩久久久精品| 尤物网站在线看| 国产精品久久久久久久久久辛辛 | 中文字幕在线一区免费| 日韩精品成人一区二区在线观看| 久草福利在线视频| 久久久噜噜噜久噜久久综合| 欧美国产综合视频| 色鬼7777久久| 久久美女高清视频| 欧美午夜精品久久久久久蜜| 国产精品久久一区二区三区不卡 | 亚洲日本精品国产第一区| 国际av在线| 国产日本欧洲亚洲| 亚洲一区bb| 日本精品在线| 一区二区三区成人在线视频| 成人免费性视频| 91九色国产在线播放| 婷婷开心激情综合| av动漫免费看| 黄色成人小视频| 7777女厕盗摄久久久| 中文字幕制服丝袜| 色综合久久中文| 国产亚洲欧美日韩美女| 激情无码人妻又粗又大| 牛牛国产精品| 97在线视频一区| 日本黄色中文字幕| 久久精品国产一区二区| 亚洲一区二区三区777| 国产 欧美 精品| 久久久av毛片精品| 中文字幕日韩精品一区二区| 日韩精品亚洲人成在线观看| 疯狂蹂躏欧美一区二区精品| 丁香婷婷激情网| 亚洲欧美一级| 亚洲国产精品99久久| 熟女少妇内射日韩亚洲| 亚洲色图欧美| 欧美中文在线观看| 一级特黄色大片| 不卡的看片网站| 午夜精品亚洲一区二区三区嫩草| 1769免费视频在线观看| 精品国产1区2区| mm131国产精品| 欧美激情一级精品国产| 色欲狠狠躁天天躁无码中文字幕 | caoporn国产一区二区| 久久免费看av| 国产精品扒开做爽爽爽的视频| 亚欧色一区w666天堂| www.涩涩涩| 美女网站色精品尤物极品姐弟| 亚洲深夜福利视频| 青草影院在线观看| 日韩主播视频在线| 国产精品一区二区免费| 色综合久久影院| 欧美日韩黄色大片| 一级全黄裸体片| 成人影视亚洲图片在线| 8050国产精品久久久久久| 国产免费一区二区三区免费视频| 久久一区二区三区四区| 屁屁影院ccyy国产第一页| 国产欧美在线观看免费| 日韩精品亚洲视频| 久久综合激情网| 极品少妇xxxx偷拍精品少妇| 欧美日产一区二区三区在线观看| 国产美女一区视频| 欧美一二三区在线| 貂蝉被到爽流白浆在线观看 | 亚洲精品v日韩精品| 久久午夜夜伦鲁鲁一区二区| 欧美色图婷婷| 欧美韩日一区二区| 99免费在线视频| 国产精品欧美极品| 日日噜噜噜噜久久久精品毛片| 天堂网av成人| 5566成人精品视频免费| 日本黄色三级视频| 亚洲不卡一区二区三区| 成年人看片网站| 欧美成人日韩| 亚洲最大成人网色| а√天堂资源地址在线下载| 欧美久久久久久蜜桃| 亚洲精品自拍视频在线观看| 欧美a级一区二区| 亚洲成人在线视频网站| 九九九伊在线综合永久| 在线观看国产成人av片| 波多野结衣一区二区三区在线 | 狠狠网亚洲精品| 一区二区三区四区久久| 亚洲精品tv| 久久亚洲私人国产精品va | 亚洲精品成人久久电影| 精品一区在线视频| 成人国产一区二区三区精品| 成人一级生活片| 一区三区自拍| 97香蕉超级碰碰久久免费软件| 手机看片一区二区三区| 精品欧美一区二区三区| 97超碰在线资源| 日欧美一区二区| 亚洲精品成人自拍| www.久久久.com| 久久99精品久久久久久琪琪| 好吊色视频一区二区| 亚洲大片免费看| 九色porny自拍视频| 轻轻草成人在线| 老司机午夜免费福利视频| 一区二区中文字幕在线观看| 97av在线视频| 福利在线播放| 91精品欧美综合在线观看最新| 男女羞羞免费视频| 97精品电影院| 午夜dv内射一区二区| 亚洲成人99| 韩国成人av| 国产成人午夜性a一级毛片| 久久福利视频网| 色窝窝无码一区二区三区| 日本韩国精品一区二区在线观看| 中文字幕欧美激情极品| 国产美女在线观看一区| 日本午夜激情视频| 欧美日韩精品在线一区| 97超碰人人看人人| 六月婷婷综合| 伦理中文字幕亚洲| 青青草免费观看免费视频在线| 欧美日韩电影在线播放| 免费观看一区二区三区毛片 | 亚洲成人自拍视频| 试看120秒一区二区三区| 欧美中文字幕第一页| 又爽又大又黄a级毛片在线视频| 日韩免费成人网| 一级片在线免费播放| 亚洲午夜电影在线观看| 人妻精品久久久久中文| 国产福利不卡视频| www.99在线| 国产精品入口| 日本黄色片一级片| 久久影院100000精品| 国产一区二区三区四区hd| 国产极品久久久久久久久波多结野| 成人97在线观看视频| 国产在线网站| 精品成人在线观看| 亚洲在线视频播放| 日本韩国欧美一区二区三区| 国产在线欧美在线| 中文字幕一区二区三区四区| 不卡一区二区在线观看| 福利一区福利二区| 黄色aaaaaa| 蜜臀久久99精品久久久画质超高清| 无码 制服 丝袜 国产 另类| 亚洲精品一区二区妖精| 亚洲午夜精品国产| 免费欧美一区| 精品国产免费人成电影在线观...| 国产精品一站二站| 国产精品免费在线免费| 男人皇宫亚洲男人2020| 国外视频精品毛片| 日本在线视频www鲁啊鲁| www日韩中文字幕在线看| 国产69精品久久app免费版| 日韩成人中文字幕| 理论片中文字幕| 日韩精品资源二区在线| 国产剧情精品在线| 欧美精品aⅴ在线视频| 中国a一片一级一片| 色菇凉天天综合网| 中文字幕亚洲乱码熟女1区2区| 精品福利樱桃av导航| 日韩 欧美 精品| 婷婷综合五月天| 久久艹免费视频| 天天综合色天天| 91浏览器在线观看| 岛国av一区二区| 五月天综合激情网| 一本色道久久综合亚洲aⅴ蜜桃 | 日韩精品视频网| 欧美精品一区二区三区免费播放| 亚洲欧美日韩视频二区| 免费日韩视频在线观看| 久久久亚洲人| 一本久道中文无码字幕av| 日韩精品免费专区| www.com黄色片| 蜜臀久久久久久久| 日本国产一级片| 国产一区二区视频在线播放| 污免费在线观看| 国产成人自拍高清视频在线免费播放| 色综合久久久无码中文字幕波多| 成熟亚洲日本毛茸茸凸凹| 国产午夜在线一区二区三区| bt7086福利一区国产| 久久人人妻人人人人妻性色av| 99久久伊人精品| 人人妻人人藻人人爽欧美一区| 国产三级久久久| 国产福利视频网站| 亚洲国产一区在线观看| 日韩视频在线观看一区| 在线视频一区二区免费| 亚洲一区二区影视| 日韩欧美色综合网站| 婷婷在线观看视频| 亚洲色图色老头| 激情成人四房播| 992tv成人免费视频| 韩国女主播一区二区| 亚洲sss综合天堂久久| 国产精品久久久久久久久久白浆| 久久精品国产一区二区三区日韩| 国产一区二区三区四区大秀| 男插女免费视频| 中文一区在线| 日本人69视频| av一本久道久久综合久久鬼色| 亚洲自拍偷拍图| 亚洲综合在线观看视频| 亚洲GV成人无码久久精品| 56国语精品自产拍在线观看| 性xxxx视频| 日韩在线观看免费av| 美女露胸视频在线观看| 国产精品午夜视频| 精品精品国产毛片在线看| 四虎永久国产精品| 国语精品一区| 五月天中文字幕在线| 91小视频免费观看| 538精品在线视频| 色综合色综合色综合| www.xxxx国产| 在线播放日韩精品| h片在线观看视频免费| 成人h视频在线观看播放| 一本色道久久综合狠狠躁的番外| 日韩精品一区二区三区电影| 狂野欧美一区| 亚洲一区二区三区四区av| 国产精品麻豆网站| 国产精品视频一区在线观看| 日韩一区二区免费高清| 在线看免费av| 欧美在线视频一区二区| 成人爽a毛片| 福利网在线观看| 日韩电影在线看| 日本一区二区三区网站| 亚洲午夜在线视频| 国产特黄一级片| 日韩中文视频免费在线观看| 免费观看一级欧美片| 国产一区二区三区av在线| 91精品国产91久久久久久黑人| 在线免费视频一区| 久久一区二区视频| 国产精品免费精品一区| 亚洲精品国产综合久久| 2020国产在线| 国产一区二区三区av在线| 午夜国产一区| 国产在线视频三区| 国产精品美女www爽爽爽| 探花国产精品一区二区| 亚洲区中文字幕| 欧美性xxx| 日韩av不卡在线播放| 久久久xxx| 国产aⅴ激情无码久久久无码| 欧美性色视频在线| 日中文字幕在线| 欧美亚洲成人网| 蜜桃一区二区三区| 色欲av无码一区二区人妻| 97精品视频在线观看自产线路二| 日本五十路女优| 日韩精品福利网站| 中文不卡1区2区3区| 欧美极品jizzhd欧美| 日日夜夜免费精品视频| 亚洲精品国产精品国自| 欧美日韩在线观看一区二区| 色老头视频在线观看| 国产日韩欧美电影在线观看| 亚洲经典一区| 久久人妻少妇嫩草av蜜桃| 亚洲国产精品久久久男人的天堂| 少妇一区二区三区四区| 欧洲成人免费视频| 日韩大片在线观看| 亚洲午夜激情影院| 亚洲精品写真福利| 天天干天天舔天天射| 日本不卡免费高清视频| 成久久久网站| 精品国产午夜福利在线观看| 亚洲网友自拍偷拍| 日本一卡二卡四卡精品 | 亚洲中文一区二区三区| 免费av在线一区| 免费观看成人www动漫视频| 男女午夜激情视频| 国产精品国产三级国产有无不卡| 国产伦子伦对白视频| 午夜精品久久久久久久久久久久久| 女优一区二区三区| 天堂在线中文在线| 亚洲国产精品一区二区尤物区| 四虎影视精品成人| 国产精品香蕉国产| 欧美午夜不卡| 手机看片日韩av| 欧美mv和日韩mv国产网站| 美女福利一区二区| 四虎精品欧美一区二区免费| 94色蜜桃网一区二区三区| 中文字幕制服诱惑| 欧美激情视频给我| 欧美视频免费| 潘金莲一级淫片aaaaa| 在线这里只有精品| 污污的网站在线免费观看| 欧美亚洲精品日韩| 国产成人aaa| 国产精品无码一区| 国产综合在线视频| 999精品视频| 欧美多人猛交狂配| 精品成人a区在线观看| 丁香久久综合| 日韩中文字幕三区| 亚洲精品福利视频网站|