二叉樹順序儲存之堆(上)

2021-09-23 22:39:50 字數 4192 閱讀 6185

typedef

int hpdatatype;

typedef

struct heap

heap;

// 用陣列初始化堆

void

initheap

(heap* hp, hpdatatype* array,

int size)

;// 初始化乙個空堆

void

initemptyheap

(heap* hp,

int capacity)

;// 在堆中插入值為data的元素

void

insertheap

(heap* hp, hpdatatype data)

;// 刪除堆頂元素

void

eraseheap

(heap* hp)

;// 獲取堆中有效元素個數

intheapsize

(heap* hp)

;// 檢測堆是否為空堆

intheapempty

(heap* hp)

;// 獲取堆頂元素

hpdatatype heaptop

(heap* hp)

;// 銷毀堆

void

destroyheap

(heap* hp)

;

熟悉堆的概念以及特性

如果有乙個關鍵碼集合k = ,把它的所有元素按照完全二叉樹的順序儲存方式儲存在乙個一維陣列中,並滿足:ki <= k2i+1 且ki<= k2i+2(ki>= k2i+2 且 ki >= k2i+2) i = 0, 1, 2, …,則稱為小堆(或大堆)。將根節點最大的堆叫最大堆或大根堆,根節點最小的堆叫最小堆或小根堆。

堆得性質:

實現堆的以下介面:

直接上**

注釋即解釋總結

heap.h

#include

#include

#include

#include

typedef

int hpdatatype;

typedef

struct heap

heap,

*pheap;

// 用陣列初始化堆

void

initheap

(heap* hp, hpdatatype* array,

int size)

;// 初始化乙個空堆

void

initemptyheap

(heap* hp,

int capacity)

;// 在堆中插入值為data的元素

void

insertheap

(heap* hp, hpdatatype data)

;// 刪除堆頂元素

void

eraseheap

(heap* hp)

;// 獲取堆中有效元素個數

intheapsize

(heap* hp)

;// 檢測堆是否為空堆

intheapempty

(heap* hp)

;// 獲取堆頂元素

hpdatatype heaptop

(heap* hp)

;// 銷毀堆

void

destroyheap

(heap* hp)

;

heap.c

#define _crt_secure_no_warnings 1

#include

"heap.h"

//建大堆

void

swap

(hpdatatype* pleft, hpdatatype* pright)

void

adjustdown

(hpdatatype* array,

int size,

int parent)

//向下調整將所傳節點(這次傳的是根節點)排到相應位置

if(array[child]

> array[parent]

)else

return;}

}void

adjustup

(hpdatatype* array,

int size,

int child)

else

return;}

}void

checkcapacity

(pheap hp)

// 拷貝元素

for(

int i =

0; i < hp->_size;

++i)

ptmp[i]

= hp->_array[i]

;// 釋放舊空間

free

(hp->_array)

; hp->_array = ptmp;

hp->_capacity = newcapacity;}}

// 用陣列初始化堆

void

initheap

(heap* hp, hpdatatype* array,

int size)

//是要把array陣列(大小是size)放進堆hp中使其初始化

//用陣列初始化堆,傳的是陣列的大小size

hp->_capacity = size;

//陣列直接就放滿了

//需不需要迴圈?需要的

for(

int i =

0; i < size;

++i)

hp->_size = size;

//陣列直接就放滿了

//調整為堆

int root =

(size -2)

>>1;

// 找完全二叉數中倒數第乙個非葉子節點

for(

; root >=0;

--root)

}// 初始化乙個空堆

void

initemptyheap

(heap* hp,

int capacity)

//初始化空堆,傳的是capacity,並不是size

hp->_capacity = capacity;

hp->_size =0;

}// 在堆中插入值為data的元素

void

insertheap

(heap* hp, hpdatatype data)

// 刪除堆頂元素

void

eraseheap

(heap* hp)

//為什麼不直接刪除最後乙個元素?只能刪除堆頂元素

// 獲取堆中有效元素個數

intheapsize

(heap* hp)

// 檢測堆是否為空堆

intheapempty

(heap* hp)

// 獲取堆頂元素

hpdatatype heaptop

(heap* hp)

// 銷毀堆

void

destroyheap

(heap* hp)

}void

testheap1()

;initheap

(&hp, array,

sizeof

(array)

/sizeof

(array[0]

));printf

("%d\n"

,heapsize

(&hp));

printf

("%d\n"

,heaptop

(&hp));

eraseheap

(&hp)

;printf

("%d\n"

,heaptop

(&hp));

insertheap

(&hp,0)

;printf

("%d\n"

,heaptop

(&hp));

destroyheap

(&hp);}

intmain()

順序儲存二叉樹

從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉換,即陣列可以轉換成樹,樹也可以轉換成陣列,看下面的示意圖。順序二叉樹通常只考慮完全二叉樹 第n個元素的左子節點為 2 n 1 第n個元素的右子節點為 2 n 2 第 n 個元素的父節點為 n 1 2 n 表示二叉樹中的第幾個元素 按 0 開始編號...

順序儲存二叉樹

從資料儲存來看,陣列儲存方式和樹的儲存方式可以相互轉換,即陣列可以轉換成樹,樹也可以轉換成陣列。陣列轉換成樹即是將陣列中的各個元素按照二叉樹的層次儲存起來的過程。原陣列 1,2,3,4,5,6,7 轉換為順序二叉樹如下圖所示 順序儲存二叉樹的特點 通常只考慮完全二叉樹 第n個元素的左子節點為2 n ...

順序儲存二叉樹

package com.datastructure.tree.binarytree 順序儲存二叉樹 1。順序儲存二叉樹通常只考慮完全二叉樹 2。第n個元素的左子節點為2 n 1 3。第n個元素的右子節點為2 n 2 4。第n個元素的父親節點為 n 1 2 public class sequentia...