資料結構 24 順序結構儲存二叉樹堆

2021-09-30 20:51:43 字數 4006 閱讀 5037

#pragma once

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);

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

int heapsize(heap* hp);

// 檢測堆是否為空堆

int heapempty(heap* hp);

// 獲取堆頂元素

hpdatatype heaptop(heap* hp);

// 銷毀堆

void destroyheap(heap* hp);

//檢測容量

void checkcapacity(heap* hp);

#include "heap.h"

#include#include #include void swap(hpdatatype*a, hpdatatype*b)

void adjustdown(hpdatatype* array, int size, int parent)

if (array[child] < array[parent])

else

}}void adjustup(hpdatatype* array, int size, int child) }}

void initheap(heap* hp, hpdatatype* array, int size)

hp->_size = size;

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

//等於0也是要調整的

while (lastleaf >= 0) }

void initemptyheap(heap* hp, int capacity);

void insertheap(heap* hp, hpdatatype data)

void eraseheap(heap* hp)

//把堆頂元素和最後乙個元素互換,然後size--;在向下調整

swap(&hp->_array[0], &hp->_array[hp->_size - 1]);

hp->_size--;

adjustdown(hp->_array, hp->_size, 0);

}int heapsize(heap* hp)

void checkcapacity(heap* hp)

for (int i = 0; i < hp->_size; ++i)

//釋放舊空間

free(hp->_array);

hp->_array = tmp;

hp->_capacity = newcapacity; }}

int heapempty(heap* hp)

return 1;

}hpdatatype heaptop(heap* hp)

return hp->_array[0];

}void destroyheap(heap* hp)

}void heaptest()

; initheap(&hp, a, sizeof(a) / sizeof(a[0]));

printf("size=%d\n", heapsize(&hp));

printf("堆頂:%d\n", heaptop(&hp));

eraseheap(&hp);

printf("刪除堆頂元素成功!\n");

printf("size=%d\n", heapsize(&hp));

printf("堆頂:%d\n", heaptop(&hp));

insertheap(&hp, 13);

printf("插入元素成功!\n");

printf("size=%d\n", heapsize(&hp));

printf("堆頂:%d\n", heaptop(&hp));

insertheap(&hp, 0);

printf("插入元素成功!\n");

printf("size=%d\n", heapsize(&hp));

printf("堆頂:%d\n", heaptop(&hp));

eraseheap(&hp);

printf("刪除堆頂元素成功!\n");

printf("size=%d\n", heapsize(&hp));

printf("堆頂:%d\n", heaptop(&hp));

建立乙個函式指標:

typedef int(*pcom)(hpdatatype, hpdatatype);

typedef struct heap

heap;

給初始化和向上向下調整加入引數:

void initheap(heap* hp, hpdatatype* array, int size,pcom compare);

void adjustdown(hpdatatype* a, int size, int parent, pcom compare)

void adjustup(hpdatatype* a, int size, int child,pcom compare)

具體比較的實現:

int less(hpdatatype a, hpdatatype b)

對原先比較的修改:

向下調整中:

if (child + 1 < size && compare(a[child + 1] , a[child]))

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

向上調整中:

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

呼叫時的引數傳遞:

//排序

int end = size - 1;

while (end != 0)

}

top k問題在【資料結構---26】中

資料結構 順序儲存二叉樹

include iostream using namespace std define max node size 100 二叉樹的最大節點數 typedef char sqbitree max node size 1 0號單元節點個數 建立二叉樹 void creat tree sqbitree ...

資料結構之順序儲存二叉樹

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

資料結構 解析二叉樹的順序儲存

二叉樹的儲存結構可以分為兩種 在上篇文章 資料結構 樹 二叉樹及四種遍歷解析實現 使用鏈式儲存二叉樹,這篇完成順序儲存 以陣列的方式存放二叉樹,要完成4種遍歷方式,需要陣列與樹結點存在對應關係 順序儲存二叉樹的特點 n表示陣列的下標,對應二叉樹的第幾個元素 如2,是陣列下標1,左子結點為2 1 1 ...