若設二叉樹的深度為h,除第h層外,其它各層 (1 ~ h-1) 的結點數都達到最大個數,第h層的所有節點都集中在左邊的若干位置,這就是完全二叉樹
以小根堆舉例
具有完全二叉樹的特性,插入乙個節點的時候,需要保證節點插入後,仍然是一顆完全二叉樹,然後在進行調整,使它滿足二叉堆的另乙個特性
具有完全二叉樹的特性,刪除乙個幾點的時候,要馬上恢復它具有完全二叉樹特性
舉個例子:
陣列形式:1 2 3 5 4 6 7 8 9
二叉堆形式:
12 3
5 4 6 7
8 9此處 n 是陣列下標
節點位置
:n
左孩子位置
:2 * n + 1
右孩子位置
:2 * n + 2
舉例:節點[2]下標:1
節點[5]下標:3 = 2 * 1 + 1
節點[4]下標:4 = 2 * 1 + 2
看乙個**更加了解一下:
#include
#include
#include
using
namespace std;
// 下沉:即把當前節點和孩子節點進行比較
void
downadjust
(int
* a ,
int parent ,
int indexsize)
// 當父節點比子節點都小或者相等時,下沉結束
if(temp <= a[child]
)// 單向賦值(為啥不是)
a[parent]
= a[child]
; parent = child;
child =
2* parent +1;
}
a[parent]
= temp;
}// 上浮:對插入的節點執行上浮操作 indexsize插入前最後乙個元素的下標
void
upadjust
(int
* a ,
int indexsize)
a[chlid]
= temp;
}// 構建二叉堆
void
buildheap
(int
* arr ,
int indexsize)
}void
printarr
(int
* a ,
int size)
printf
("\n");
}int
main()
;printarr
(a ,10)
;// 本例都是以小根堆為例子
// 構建二叉堆:即從下往上對非葉子節點進行下沉,每次都沉到底/或父節點比左右子節點都小為止
buildheap
(a ,9)
;printarr
(a ,10)
;return0;
}
輸出結果:
10127
8635
2191
2386
751210
9
二叉堆構建
二叉堆本質上一種完全二叉樹,分為 最小堆和最大堆,二叉堆的根結點叫做堆頂 最大堆 最大堆的任何乙個父節點的值都大於或等於他的左右節點的值,最大堆的堆頂是整個堆中最大元素 最小堆 最小堆的任何乙個父節點的值都小於或等於他的左右節點的值,最小堆的堆頂是這個堆中最小元素 二叉堆的幾種操作 1 插入節點 插...
二叉樹 二叉搜尋樹建立 插入 刪除 查詢等操作
二叉搜尋樹性質如下 二叉搜尋樹篇 include include struct search tree typedef struct search tree typedef typedef struct search tree typedef stree node 向二叉搜尋樹插入乙個元素 int ...
(二叉)堆操作
堆操作 實驗目的 一 建堆 將陣列a 1.n 變成乙個最大堆。二 堆排序 將乙個堆中的元素按遞減排序輸出。三 用插入方法建堆 堆大小從1到n每次插入乙個元素到堆中,直到n個元素入堆。實驗原理 二叉 堆是乙個陣列,它可以被看成乙個近似的完全二叉樹。樹上的每乙個結點對應陣列中的乙個元素。除了最底層外,該...