二叉樹的順序結構及實現

目錄

  • 1 二叉樹的順序結構
  • 2. 堆的概念及結構
  • 3 .堆的實現(小堆)

1 二叉樹的順序結構

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

2. 堆的概念及結構

如果有一個關鍵碼的集合K = { , , ,…, },把它的所有元素按完全二叉樹的順序存儲方式存儲在一個一維數組中,并滿足: <= 且 <= ( >= 且 >= ) i = 0,1,
2…,則稱為小堆(或大堆)。將根節點最大的堆叫做最大堆或大根堆,根節點最小的堆叫做最小堆或小根堆。
堆的性質:
1.堆中某個節點的值總是不大于或不小于其父節點的值;
2.堆總是一棵完全二叉樹。

在這里插入圖片描述
在這里插入圖片描述

3 .堆的實現(小堆)

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
typedef int HPDataType;
typedef struct Heap
{int* a;int size;int capacity;}HP;
void HeapInit(HP* php);
void HeapDestroy(HP* php);
void HeapPush(HP* php, HPDataType x);
// 規定刪除堆頂(根節點)
void HeapPop(HP* php);
HPDataType HeapTop(HP* php);
size_t HeapSize(HP* php);
bool HeapEmpty(HP* php);
#define _CRT_SECURE_NO_WARNINGS 1
#include"Heap.h"
void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}
void AdjustUp(HPDataType* a, int child)
{int parent =(child - 1 )/ 2;while (child > 0){if (a[parent] > a[child]){Swap(&a[parent], &a[child]);child = parent;parent = (child - 1) / 2;}elsebreak;}}
void AdjustDown(HPDataType* a, int size,int parent)
{int child = parent * 2 + 1;while (child<size){if (child+1<size&&a[child + 1] < a[child]){child++;}if (a[parent] > a[child]){Swap(&a[parent], &a[child]);parent = child;child = parent * 2 + 1;}elsebreak;}}
void HeapInit(HP* php)
{php->a = NULL;php->capacity = 0;php->size = 0;}
void HeapDestroy(HP* php)
{free(php->a);free(php);}
HPDataType HeapTop(HP* php)
{return php->a[0];
}
size_t HeapSize(HP* php)
{return php->size;
}
bool HeapEmpty(HP* php)
{return php->size == 0;
}
void HeapPush(HP* php, HPDataType x)
{assert(php);if (php->capacity == php->size){int newcapacity = php->capacity == 0 ? 4 : php->capacity * 2;HPDataType* tmp = (HPDataType*)realloc(php->a, sizeof(HPDataType) * newcapacity);php->a = tmp;php->capacity = newcapacity;}php->a[php->size++] = x;AdjustUp(php->a, php->size-1);}
void HeapPop(HP* php)
{assert(php);Swap(&php->a[0], &php->a[php->size - 1]);php->size--;int parent = 0;AdjustDown(php->a, php->size, 0);}

堆的建立有兩個重要算法即向上調整和向下調整法
堆向下調整算法:現在我們給出一個數組,邏輯上看做一顆完全二叉樹。我們通過從根節點開始的向下調整算法可以把它調整 成一個小堆。向下調整算法有一個前提:左右子樹必須是一個堆,才能調整
向上調整法:
向上調整算法,直到滿足堆。

結尾:今天的分享到此結束,喜歡的朋友如果感覺有幫助可以點贊三連支持,咱們共同進步!

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

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

相關文章

【Pytorch】Visualization of Feature Maps(3)

學習參考來自&#xff1a; Image Style Transform–關于圖像風格遷移的介紹github&#xff1a;https://github.com/wmn7/ML_Practice/tree/master/2019_06_03 文章目錄 風格遷移 風格遷移 風格遷移出處&#xff1a; 《A Neural Algorithm of Artistic Style》&#xff08;ar…

瀏覽器沒收到返回,后端也沒報錯,php的json_encode問題bug

今天網站遇到個問題&#xff0c;后端返回異常&#xff0c;但是瀏覽器狀態碼200&#xff0c;但是看不到結果。經過排查發現&#xff0c;我們在返回結果的時候使用了json_encode返回給前端&#xff0c;結果里面的字符編碼異常&#xff0c;導致json_encode異常&#xff0c;但是php…

前綴和——724. 尋找數組的中心下標

文章目錄 &#x1f353;1. 題目&#x1fad2;2. 算法原理&#x1f984;解法一&#xff1a;暴力枚舉&#x1f984;解法二&#xff1a;前綴和 &#x1f954;3. 代碼實現 &#x1f353;1. 題目 題目鏈接&#xff1a;724. 尋找數組的中心下標 - 力扣&#xff08;LeetCode&#xff0…

【限時免費】20天拿下華為OD筆試之【前綴和】2023B-數字游戲【歐弟算法】全網注釋最詳細分類最全的華為OD真題題解

文章目錄 題目描述與示例題目描述輸入描述輸出描述示例一輸入輸出 示例二輸入輸出說明 解題思路前綴和簡單的數學推導哈希集合的使用 代碼PythonJavaC時空復雜度 華為OD算法/大廠面試高頻題算法練習沖刺訓練 題目描述與示例 題目描述 小明玩一個游戲。 系統發1n張牌&#xff…

某60區塊鏈安全之未初始化的存儲指針實戰一學習記錄

區塊鏈安全 文章目錄 區塊鏈安全未初始化的存儲指針實戰一實驗目的實驗環境實驗工具實驗原理實驗過程 未初始化的存儲指針實戰一 實驗目的 學會使用python3的web3模塊 學會分析以太坊智能合約未初始化的存儲指針漏洞 找到合約漏洞進行分析并形成利用 實驗環境 Ubuntu18.04操…

深度學習之八(生成對抗網絡--Generative Adversarial Networks,GANs)

概念 生成對抗網絡(Generative Adversarial Networks, GANs)是一種深度學習模型,由 Ian Goodfellow 等人于2014年提出。GAN 的目標是通過訓練兩個神經網絡(生成器和判別器),使得生成器能夠生成與真實數據相似的樣本,而判別器能夠區分真實樣本和生成樣本。這兩個網絡相…

多元邏輯回歸模型的概念、模型檢驗以及應用

多元邏輯回歸是邏輯回歸的一種擴展&#xff0c;用于處理多類別分類問題。在二元邏輯回歸中&#xff0c;我們通過一個邏輯函數&#xff08;也稱為S形函數&#xff09;將輸入特征映射到一個概率值&#xff0c;用于預測兩個類別中一個的概率。而在多元邏輯回歸中&#xff0c;我們面…

沃趣班11月月考題目解析

沃趣班11月月考題目解析 1.在oracle中創建用戶時&#xff0c;若未設置default tablespace關鍵字&#xff0c;則oracle將哪個表空間分配給用戶作為默認表空間 答案&#xff1a;D.user SQL> create user mytest identified by 123456; SQL> grant connect to mytest; SQL…

【開源】基于Vue.js的海南旅游景點推薦系統的設計和實現

項目編號&#xff1a; S 023 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S023&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S023&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 用戶端2.2 管理員端 三、系統展示四…

CSS特效017:球體漲水的效果

CSS常用示例100專欄目錄 本專欄記錄的是經常使用的CSS示例與技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花邊信息三部分內容。其中CSS布局主要是列出一些常用的CSS布局信息點&#xff0c;CSS特效主要是一些動畫示例&#xff0c;CSS花邊是描述了一些CSS…

前端錯誤處理與調試

** javascript錯誤處理 ** 由于javascript本身是動態語言&#xff0c;而且沒有固定的開發工具&#xff0c;因此他普遍認為是最難以調試的語言&#xff0c;在ECMAScript3新增了try-catch和throw以及一些錯誤類型&#xff0c;讓開發人員能適當的處理錯誤&#xff0c;緊接著web瀏…

多tab頁表單校驗如何做

多tab頁表單校驗如何做 在多tab頁表單中進行校驗&#xff0c;可以按照以下步驟進行&#xff1a; 創建一個表單對象&#xff0c;用于存儲表單數據和校驗規則。 分為多個tab頁&#xff0c;每個tab頁對應一個表單頁面。 定義每個tab頁中的表單字段及其相應的校驗規則。 在切換…

PHP 賦值、算數和比較運算符 學習資料

PHP 賦值、算數和比較運算符 在 PHP 中&#xff0c;賦值、算數和比較運算符用于對變量進行賦值、進行數學運算和比較操作。以下是對這些運算符的介紹和示例&#xff1a; 賦值運算符 賦值運算符用于給變量賦值。常用的賦值運算符有 、、-、*、/ 等。 示例&#xff1a; $a …

芯能轉債上市價格預測

芯能轉債-113679 基本信息 轉債名稱&#xff1a;芯能轉債&#xff0c;評級&#xff1a;AA-&#xff0c;發行規模&#xff1a;8.8億元。 正股名稱&#xff1a;芯能科技&#xff0c;今日收盤價&#xff1a;12.63元&#xff0c;轉股價格&#xff1a;13.1元。 當前轉股價值 轉債面…

基于遺傳優化的多屬性判決5G-Wifi網絡切換算法matlab仿真

目錄 1.算法運行效果圖預覽 2.算法運行軟件版本 3.部分核心程序 4.算法理論概述 5.算法完整程序工程 1.算法運行效果圖預覽 2.算法運行軟件版本 MATLAB2022a 3.部分核心程序 .......................................................................... %接收功率、網…

數字孿生智慧校園 Web 3D 可視化監測

當今&#xff0c;智慧校園發展階段亟需推動信息可視化建設與發展&#xff0c;將大數據、云計算、可視化等高新技術相融合&#xff0c;為校園師生創造科學智能的學習環境&#xff0c;并實現教學資源最大化和信息服務智能化。幫助學校更好地應用校園可視化技術&#xff0c;提升校…

原型模式 (Prototype Pattern)

定義&#xff1a; 原型模式&#xff08;Prototype Pattern&#xff09;是一種創建型設計模式&#xff0c;它用于創建重復的對象&#xff0c;同時保持性能。這種模式的核心思想是通過復制一個已存在的實例來創建新的實例&#xff0c;而不是新建實例并對其進行初始化。原型模式適…

jetson xavier NX深度學習環境配置

文章目錄 jetson xavier NX深度學習環境配置1. SD卡系統燒錄1.1 材料1.2 軟件配置1.3 格式化SD卡1.4 系統鏡像燒錄 2. 環境配置2.1 cuda環境配置2.2 安裝依賴庫2.3 安裝python及依賴環境2.4 安裝pytorch環境 jetson xavier NX深度學習環境配置 1. SD卡系統燒錄 1.1 材料 SD …

面試題 —— 前端精選(1)

文章目錄 前言 闡述 JS 的事件循環 JS 中的計時器能做到精確計時嗎&#xff1f;為什么&#xff1f; 如何理解 JS 的異步&#xff1f; 前言 本文章介紹三道圍繞 JavaScript 的精選面試題 闡述 JS 的事件循環 事件循環?叫做消息循環&#xff0c;是瀏覽器渲染主線程的?作?式…

CentOS虛擬機重置賬號密碼

虛擬機忘記密碼了 一般來說&#xff0c;虛擬機的賬號密碼&#xff0c;工作中都會有文檔記錄&#xff0c;如果忘記了可以查看文檔。但是也有特例&#xff0c;虛擬機的密碼沒有記錄到文檔中&#xff0c;嘗試了很多次依然登錄失敗&#xff0c;這時候就只能重置賬號密碼了。 1.重…