數據結構之二叉樹(2)

數據結構之二叉樹(2)

  • 1.二叉樹的存儲結構
  • 2.實現順序結構二叉樹
    • 2.1何為堆
    • 2.2堆的性質
    • 2.3堆的定義
    • 2.3堆的初始化與銷毀
  • 3.1向上調整算法
  • 3.2向下調整算法
  • 4.入堆
  • 5.出堆

讓花成花,讓樹成樹
上一次我們學習了樹的分類,并初步了解了二叉樹。
今天我們深入了解二叉樹并寫出C語言代碼

1.二叉樹的存儲結構

在學習C語言時,我們就知道了數據有兩種存儲結構,一種是順序結構,一種是鏈式結構。
對于用數組來實現的二叉樹,完全二叉樹要優于非完全二叉樹。
在這里插入圖片描述
在這里插入圖片描述
我們從圖中可以看到,非完全二叉樹會有空間浪費。
現實中我們通常把堆(?種?叉樹)使?順序結構的數組來存儲,需要注意的是這?的堆和操作系統虛擬進程地址空間中的堆是兩回事,?個是數據結構,?個是操作系統中管理內存的?塊區域分段。

2.實現順序結構二叉樹

堆是?種特殊的?叉樹,具有?叉樹的特性的同時,還具備其他的特性。

2.1何為堆

堆是一種樹形數據結構,每個父節點都大于或等于(最大堆)或者小于或等于(最小堆)其子節點,根節點的值是堆中所有元素的最大值或最小值。
在這里插入圖片描述
在這里插入圖片描述

2.2堆的性質

  • 堆中某個結點的值總是不?于或不?于其?結點的值;
  • 堆總是?棵完全?叉樹

在用代碼實現前,我們還需要知道一些二叉樹的性質:
在這里插入圖片描述

2.3堆的定義

typedef int HpDataType;
typedef struct Heap {HpDataType* arr;int size;int capacity;
}Hp;

size表示有效個數
capacity表示可用容量

2.3堆的初始化與銷毀

//初始化
void HpInit(Hp* php) {assert(php);php->arr = NULL;php->size = php->capacity = 0;
}
//銷毀
void HpDestroy(Hp* php) {assert(php);if (php->arr)free(php->arr);php->size = php->capacity = 0;
}

3.1向上調整算法

當我們往堆中添加數據時,怎么能使數據自動校正自己的位置,使得其插入后任然滿足是一個堆。
對于大堆:

//向上調整
void AdjustUp(HpDataType* arr, int child) {int parent = (child - 1) / 2;while (child > 0) {if (arr[child] > arr[parent]) {Swap(&arr[child], &arr[parent]);child = parent;parent = (child - 1) / 2;}else {break;}}
}

每一次和父節點比較,如果比父節點大則交換并使父節點變子節點,再找新的父節點比較。否則退出循環。

3.2向下調整算法

對于大堆:

//向下調整
void AdjustDown(HpDataType* arr, int parent, int n) {int child = 2 * parent + 1;while (child < n) {//對于兩個子節點,先找到較大的一個,再與之比較if (child + 1 < n && arr[child] < arr[child + 1]) {child++;}if (arr[child] > arr[parent]) {Swap(&arr[child], &arr[parent]);parent = child;child = 2 * parent + 1;}else {break;}}
}

4.入堆

//入堆
void HpPush(Hp* php,HpDataType x) {assert(php);//空間不夠增容if (php->size == php->capacity) {int newcapacity = php->capacity == 0 ? 4 : 2 * (php->capacity);HpDataType* tmp = (HpDataType*)realloc(php->arr, newcapacity * sizeof(HpDataType));if (tmp == NULL) {perror("realloc fail");exit(1);}php->arr = tmp;php->capacity = newcapacity;}php->arr[php->size++] = x;//向上調整AdjustUp(php->arr, php->size - 1);
}

5.出堆

出堆指的是堆頂元素出去。

//出堆
void HpPop(Hp* php) {assert(!HpEmpty(php));Swap(&php->arr[0], &php->arr[php->size - 1]);php->size--;//重新向上調整AdjustUp(php->arr, php->size - 1);//如果使用向下調整,換成	AdjustDown(php->arr, 0, php->size);
}


如果發現錯誤,歡迎打在評論區。
主頁還有更多優質內容OvO

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/96291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/96291.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/96291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux操作系統之Ubuntu

Ubuntu是基于Debian的開源Linux發行版&#xff0c;由Canonical公司維護&#xff0c;以用戶友好性和穩定性著稱。它廣泛應用于個人電腦、服務器及云計算環境&#xff0c;支持多種硬件架構。Ubuntu的特點Ubuntu提供定期更新版本&#xff08;每6個月&#xff09;和長期支持版本&am…

kotlin的函數前面增加suspend關鍵字的作用

deepseek回答&#xff1a; Kotlin中suspend關鍵字的作用詳解 核心作用 suspend關鍵字用于標記?掛起函數?&#xff0c;使其能夠在協程中實現非阻塞的異步操作。 suspend關鍵字的本質作用 suspend關鍵字的主要作用是?標記一個函數為掛起函數?&#xff0c;使其能夠在協程中使用…

Vibe Coding實戰項目:用Qwen3-Coder做了個AI跳舞視頻生成器

大家好&#xff0c;這里是K姐。 一個 Vibe Coding 的探索者。 前段時間發現通義發起了一個Qwen3-Coder挑戰賽&#xff0c;最高獎金有10000元&#xff0c;研究了一下&#xff0c;我發現這個賽道太寬了&#xff0c;不限項目&#xff0c;用 AI Coding 做數據分析、個人Blog、抓取…

Kafka面試精講 Day 13:故障檢測與自動恢復

【Kafka面試精講 Day 13】故障檢測與自動恢復 在“Kafka面試精講”系列的第13天&#xff0c;我們將深入探討 Kafka 高可用體系中的關鍵一環&#xff1a;故障檢測與自動恢復機制。作為分布式系統的核心能力&#xff0c;Kafka 如何在 Broker 宕機、網絡分區或磁盤故障時快速感知…

【前沿技術拓展Trip Two】具身智能

具身智能&#xff08;Embodied AI&#xff09;的認識&#xff0c;進展&#xff0c;以及為何難以實現 在講具身智能之前&#xff0c;我們不得不先行介紹一下離身智能與離身認識系統這兩個極其相關且更加常見的概念 離身認識系統 其實目前絕大多數的AI&#xff0c;例如DeepSeek&a…

使用electron將vue3網頁項目包裝成pc客戶端

一、準備前工作在項目的根目錄 打開命令行工具 安裝四個依賴庫安裝報錯的話二、準備工作完成之后&#xff0c;在項目根目錄需要有倆個文件在項目根目錄創建electron文件夾在vite.config.js中添加配置項在package.json中添加配置項運行命令 npm run electron:build 打包關于mac&…

基于安全抽象模型(SAM)的汽車網絡安全防御與攻擊分析

摘要自動駕駛汽車比以往任何一種個人出行交通工具都具有更大的受攻擊可能性。這主要是因為這類汽車對通信有極高的需求&#xff0c;一方面是出于功能和安全方面的考慮&#xff0c;另一方面則是為了滿足舒適性需求。無人駕駛汽車需要與周圍環境進行通信的接口、直接連接&#xf…

線掃相機不出圖原因總結

1、幀觸發信號有問題 線掃相機出圖由幀信號決定開始采集,如果沒有幀信號線掃相機無法識別開始信號,所以不出圖 1)沒有給相機幀信號 幀信號是一個短暫的脈沖信號,持續時間不要太長,相機能識別就可以,一般由plc或者控制卡的數字量輸出口觸發,可以通過監測數字量輸出口來確…

開發避坑指南(46):Java Stream 對List的BigDecimal字段進行求和

需求 對int&#xff0c;long類型的數據求和直接用stream().mapToInt()、stream().mapToDouble()&#xff0c;可是沒有stream().mapToBigDecimal()這樣的方法&#xff0c;那么如何用stream對List的BigDecimal字段進行求和&#xff1f; 代碼實現 直接上代碼 public class OrderIn…

pycharm如何處理python項目間引用

1. 如何在pycharm中將其它項目添加到打開的項目中 如圖所示&#xff1a;文件->打開->附加&#xff08;Attach&#xff09;即可2.如何引用:直接作為一個普通package引用即可 from attack_projectxxx.modulexxx import xxx3.pyinstaller如何編譯這種引用其它項目的可執行文…

家庭勞務機器人發展階段與時間預測

家庭勞務機器人大規模進入家庭不會是一個單一的時間點&#xff0c;而是一個分階段、漸進式的過程。我們可以將這個進程分為以下幾個階段&#xff0c;并對每個階段的時間線進行預測&#xff1a;第一階段&#xff1a;單一功能機器人普及&#xff08;現在 - 2025年&#xff09;這個…

Zynq開發實踐(FPGA之spi實現)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】雖然串口用的地方比較多&#xff0c;實現起來也比較簡單。但是串口本身速度比較慢&#xff0c;不利于高速數據通信。而且單個串口沒有辦法和很多芯片…

指甲打磨機/磨甲器MCU控制方案開發,輕松解決磨甲問題

美甲打磨機/指甲打磨機核心功能需求 1. 基礎功能 無級調速(5,000-30,000 RPM&#xff0c;PWM控制) 正反轉切換&#xff08;可選&#xff0c;用于拋光/去角質&#xff09; 按鍵鎖/防誤觸&#xff08;長按3秒解鎖&#xff09; 鋰電池管理&#xff08;3.7V單節&#xff0c;帶充電指…

臨床數據挖掘與分析:利用GPU加速Pandas和Scikit-learn處理大規模數據集

點擊 “AladdinEdu&#xff0c;同學們用得起的【H卡】算力平臺”&#xff0c;注冊即送-H卡級別算力&#xff0c;80G大顯存&#xff0c;按量計費&#xff0c;靈活彈性&#xff0c;頂級配置&#xff0c;學生更享專屬優惠。 摘要 隨著電子健康記錄&#xff08;EHR&#xff09;的普…

二進制安裝MySQL 8.0指南:跨平臺、自定義數據路徑、安全遠程訪問配置

二進制安裝 MySQL 8.0 在生產或測試環境中&#xff0c;我們常常希望避免包管理器帶來的依賴和交互問題&#xff0c;尤其是當系統自帶版本過舊或安裝過程頻繁彈窗時。此時&#xff0c;使用 MySQL 官方提供的二進制壓縮包&#xff08;Generic Linux Binary&#xff09; 進行安裝…

Z檢驗與T檢驗的區別與聯系:原理、公式和案例全解

Z檢驗與T檢驗全解析&#xff1a;原理、區別與實際案例 統計學的核心任務之一&#xff0c;就是通過有限的樣本數據去推斷總體特征。在這一過程中&#xff0c;假設檢驗成為了最常見的工具。而在眾多檢驗方法中&#xff0c;Z檢驗與T檢驗幾乎是入門必學&#xff0c;也是應用最廣泛的…

SpringBoot之緩存(最詳細)

文章目錄項目準備新建項目并選擇模塊安裝添加依賴添加application.yml刪除demos.web包編寫pojo層userdto/ResultJson編寫mapper層UserMapper編寫service層UserService編寫controller層編寫配置類MybatisPlusConfig編寫測試類1 緩存分類1.1 MyBatis一級緩存1.2 MyBatis二級緩存1…

B站 韓順平 筆記 (Day 29)

目錄 1&#xff08;集合的框架體系&#xff09; 2&#xff08;Collection接口和常用方法&#xff09; 2.1&#xff08;Collection接口實現類特點&#xff09; 2.2&#xff08;常用方法&#xff09; 2.3&#xff08;遍歷元素方式1&#xff1a;迭代器&#xff09; 1&#x…

axios報錯解決:unsupported BodyInit type

目錄 問題 原因 解決方法 問題 Got ‘unsupported BodyInit type’ bug on iPhone 14(IOS 17.5) Issue #6444 axios/axios 我這里是iPhone 6plus打開會報錯白屏 好多人遇到了相同的問題 當我在 iPhone 14 上瀏覽頁面時,我收到一條錯誤消息:錯誤:不支持的 BodyInit 類型,…

iperf3網絡性能測試工具

iperf3 是一個功能非常強大的網絡性能測試工具,用于測量兩個網絡節點之間的最大TCP、UDP帶寬和性能。它通過創建數據流并測量其吞吐量來工作。 下面我將為您詳細介紹其核心用法、常用命令和參數。 核心概念:客戶端/服務器模式 iperf3 測試需要兩臺機器:一臺作為服務器端(…