国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

怎么做網(wǎng)站鏡像小程序商城

怎么做網(wǎng)站鏡像,小程序商城,上海電子商務(wù)網(wǎng)站,可以在手機建網(wǎng)站的在上篇文章數(shù)據(jù)結(jié)構(gòu)6——樹與二叉樹中,我們了解了樹和二叉樹的概念,接著上篇文章,在本篇文章中我們學(xué)習(xí)二叉樹順序結(jié)構(gòu)的實現(xiàn)。 目錄 1. 二叉樹的順序存儲結(jié)構(gòu) 2. 堆的概念及結(jié)構(gòu) 1. 堆的概念 2. 堆的結(jié)構(gòu) 3. 堆的實現(xiàn) 1. 堆節(jié)點 2. 交…

在上篇文章數(shù)據(jù)結(jié)構(gòu)6——樹與二叉樹中,我們了解了樹和二叉樹的概念,接著上篇文章,在本篇文章中我們學(xué)習(xí)二叉樹順序結(jié)構(gòu)的實現(xiàn)。



目錄

1. 二叉樹的順序存儲結(jié)構(gòu)

2. 堆的概念及結(jié)構(gòu)

1. 堆的概念

2. 堆的結(jié)構(gòu)

3. 堆的實現(xiàn)

1. 堆節(jié)點

2. 交換節(jié)點

3. 打印

4. 堆的插入

向上調(diào)整:

插入:

5. 堆的刪除

向下調(diào)整:

刪除:

6. 初始化

7. 銷毀

驗證:

源代碼:

Heap.h:

Heap.c:

test.c:


1. 二叉樹的順序存儲結(jié)構(gòu)

二叉樹一般可以使用兩種結(jié)構(gòu)存儲,一種是順序結(jié)構(gòu),一種是鏈式結(jié)構(gòu)。本篇文章我們先來研究二叉樹的順序存儲,下篇文章詳解二叉樹的鏈式存儲。

普通的二叉樹是不適合用數(shù)組來存儲的,因為可能會存在大量的空間浪費。而完全二叉樹更適合使用順序結(jié)構(gòu)存儲。現(xiàn)實中我們通常把堆(一種二叉樹)使用順序結(jié)構(gòu)的數(shù)組來存儲,需要注意的是這里的堆和操作系統(tǒng)虛擬進程地址空間中的堆是兩回事,一個是數(shù)據(jù)結(jié)構(gòu),一個是操作系統(tǒng)中管理內(nèi)存的一塊區(qū)域分段。

如圖: 完全二叉樹順序存儲:

非完全二叉樹順序存儲:

2. 堆的概念及結(jié)構(gòu)

1. 堆的概念

簡單來說,堆除了是一棵完全二叉樹之外,還要滿足堆序性。

堆中每個節(jié)點的值都大于等于其子節(jié)點的值,根節(jié)點是堆中最大的元素,這樣的堆稱為最大堆或大根堆;

相反的,堆中每個節(jié)點的值都小于等于其子節(jié)點的值,根節(jié)點是堆中最小的元素,這樣的堆稱為最小堆或小根堆;

2. 堆的結(jié)構(gòu)

3. 堆的實現(xiàn)

(本篇文章只實現(xiàn)最小堆,最大堆與最小堆是相同的道理)

1. 堆節(jié)點

typedef int HPDataType;
//堆的物理結(jié)構(gòu)與順序表相似
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;

2. 交換節(jié)點

//交換
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}

3. 打印

//打印
void HeapPrint(HP* php)
{assert(php);for (size_t i = 0; i < php->size; i++){printf("%d ", php->a[i]);}printf("\n");
}

4. 堆的插入

可是現(xiàn)在堆屬性并不滿足,因為30在5的上面,這是一個最小堆,我們需要將小的數(shù)字在上面。

為了恢復(fù)堆屬性,我們需要交換30和5:

可是現(xiàn)在仍舊沒有滿足最小堆的堆屬性,所以還需要交換10和5:

此時才得到了最小堆。

因此在插入數(shù)據(jù)后每次都要進行向上調(diào)整,于是向上調(diào)整的實現(xiàn)為:

向上調(diào)整:

//向上調(diào)整
void AdjustUP(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (parent - 1) / 2;}else{break;}}
}

插入:

//插入
void HeapPush(HP* php, HPDataType x)
{assert(php);//判斷是否需要擴容if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = realloc(php->a, sizeof(HPDataType) * newCapacity);if (tmp == NULL)//檢查是否擴容成功{perror("realloc fail");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUP(php->a, php->size - 1);//傳數(shù)組的最后一個數(shù)據(jù)
}

5. 堆的刪除

由于堆頂是最大或最小元素,為了滿足堆屬性,所以堆中每次只能刪除堆頂元素,一般的做法是先將堆頂元素與數(shù)組末尾元素先交換,再刪除末尾元素。

可是現(xiàn)在40在了堆頂,反而成了最大的元素,并不滿足最小堆,這時就需要向下調(diào)整:

每次刪除都要調(diào)整,所以向下調(diào)整的具體實現(xiàn)為:

向下調(diào)整:

//向下調(diào)整
void AdjustDown(HPDataType* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//找出小的那個孩子if (child + 1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);//繼續(xù)往下調(diào)整parent = child;child = parent * 2 + 1;}else{break;}}
}

刪除:

//刪除
void HeapPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);--php->size;AdjustDown(php->a, php->size, 0);
}

6. 初始化

//初始化
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}

7. 銷毀

//銷毀
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}

驗證:

int main()
{int a[] = { 9,3,7,10,24,14,28,72,21,5 };HP hp;HeapInit(&hp);for (size_t i = 0; i < sizeof(a) / sizeof(int); i++){HeapPush(&hp, a[i]);}HeapPrint(&hp);HeapDestroy(&hp);return 0;
}



源代碼:

Heap.h:

#pragma once#include <stdio.h>
#include <stdlib.h>
#include <assert.h>typedef int HPDataType;
//堆的物理結(jié)構(gòu)與順序表相似
typedef struct Heap
{HPDataType* a;int size;int capacity;
}HP;//交換
void Swap(HPDataType* p1, HPDataType* p2);//打印
void HeapPrint(HP* php);//初始化
void HeapInit(HP* php);//向上調(diào)整
void AdjustUP(HPDataType* a, int child);
//插入
void HeapPush(HP* php, HPDataType x);//向下調(diào)整
void AdjustDown(HPDataType* a, int n, int parent);
//刪除
void HeapPop(HP* php);//銷毀
void HeapDestroy(HP* php);

Heap.c:

#include "Heap.h"//交換
void Swap(HPDataType* p1, HPDataType* p2)
{HPDataType tmp = *p1;*p1 = *p2;*p2 = tmp;
}//打印
void HeapPrint(HP* php)
{assert(php);for (size_t i = 0; i < php->size; i++){printf("%d ", php->a[i]);}printf("\n");
}//向上調(diào)整
void AdjustUP(HPDataType* a, int child)
{int parent = (child - 1) / 2;while (child > 0){if (a[child] < a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (parent - 1) / 2;}else{break;}}
}//插入
void HeapPush(HP* php, HPDataType x)
{assert(php);//判斷是否需要擴容if (php->size == php->capacity){int newCapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = realloc(php->a, sizeof(HPDataType) * newCapacity);if (tmp == NULL)//檢查是否擴容成功{perror("realloc fail");exit(-1);}php->a = tmp;php->capacity = newCapacity;}php->a[php->size] = x;php->size++;AdjustUP(php->a, php->size - 1);//傳數(shù)組的最后一個數(shù)據(jù)
}//向下調(diào)整
void AdjustDown(HPDataType* a, int n, int parent)
{int child = parent * 2 + 1;while (child < n){//找出小的那個孩子if (child + 1 < n && a[child + 1] < a[child]){++child;}if (a[child] < a[parent]){Swap(&a[child], &a[parent]);//繼續(xù)往下調(diào)整parent = child;child = parent * 2 + 1;}else{break;}}
}//刪除
void HeapPop(HP* php)
{assert(php);assert(php->size > 0);Swap(&php->a[0], &php->a[php->size - 1]);--php->size;AdjustDown(php->a, php->size, 0);
}//初始化
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = 0;php->capacity = 0;
}//銷毀
void HeapDestroy(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}

test.c:

int main()
{int a[] = { 9,3,7,10,24,14,28,72,21,5 };HP hp;HeapInit(&hp);for (size_t i = 0; i < sizeof(a) / sizeof(int); i++){HeapPush(&hp, a[i]);}HeapPrint(&hp);HeapDestroy(&hp);return 0;
}
http://m.aloenet.com.cn/news/35452.html

相關(guān)文章:

  • 怎么查網(wǎng)站是哪家制作公司做的產(chǎn)品推廣方案要包含哪些內(nèi)容
  • 網(wǎng)站平臺建設(shè)公司經(jīng)營范圍網(wǎng)絡(luò)營銷推廣主要做什么?
  • 赤城縣城鄉(xiāng)建設(shè)局網(wǎng)站2023網(wǎng)站分享
  • 陶瓷網(wǎng)站模板下載需要留電話號碼的廣告
  • 地方門戶網(wǎng)站開發(fā)上海搜索優(yōu)化推廣哪家強
  • 成品app直播源碼旅游企業(yè)seo官網(wǎng)分析報告
  • 淘寶客網(wǎng)站能用淘寶圖標做標志嗎網(wǎng)站推廣的軟件
  • 建設(shè)公司網(wǎng)站管理制度的意義百度網(wǎng)站推廣教程
  • 怎么自己建設(shè)網(wǎng)站品牌推廣的步驟和技巧
  • 寧波網(wǎng)站建設(shè)哪家公司好代運營
  • 網(wǎng)頁美工設(shè)計需求分析網(wǎng)站快速優(yōu)化排名軟件
  • 專業(yè)網(wǎng)網(wǎng)站建設(shè)品牌推廣與傳播
  • 建設(shè)廳官方網(wǎng)站北京網(wǎng)站seo李守洪排名大師
  • 畢業(yè)設(shè)計網(wǎng)站開發(fā)實施步驟鄭州seo排名第一
  • 包裝產(chǎn)品做網(wǎng)站線上推廣策略
  • 凡科做的網(wǎng)站好垃圾信息如何優(yōu)化上百度首頁公司
  • 網(wǎng)站做下載wordpress自己做seo網(wǎng)站推廣
  • 免費建網(wǎng)站.com的區(qū)別直播營銷策略有哪些
  • wdcp wordpress長春seo結(jié)算
  • 網(wǎng)站建設(shè)歷史網(wǎng)站推廣公司排名
  • 全國工程信息網(wǎng)優(yōu)化方案怎么寫
  • 成都建站seo百度關(guān)鍵詞排名優(yōu)化
  • 自己用鋼管做里閃彈槍視頻和照網(wǎng)站b站視頻推廣
  • 網(wǎng)站美工做專題尺寸多少?如何快速推廣網(wǎng)上國網(wǎng)
  • 合肥網(wǎng)絡(luò)科技有限公司做網(wǎng)站短視頻推廣渠道
  • 用照片做模板下載網(wǎng)站好廣告推廣費用
  • 大連做網(wǎng)站誰家售后好整站關(guān)鍵詞快速排名
  • 網(wǎng)站公安備案網(wǎng)址寧波seo優(yōu)化公司
  • 辦公室租賃seo查詢友情鏈接
  • 建設(shè)網(wǎng)站的規(guī)則廣州私人做網(wǎng)站