初階數據結構:二叉樹

目錄

  • 1. 樹的相關概念
    • 1.1 簡述:樹
    • 1.2 樹的概念補充
  • 2. 二叉樹
    • 2.1 二叉樹的概念
    • 2.2 二叉樹的性質
    • 2.3 二叉樹的存儲結構與堆
      • 2.3.1 存儲結構
      • 2.3.2 堆的概念
      • 2.3.3 堆的實現
        • 2.3.3.1 堆的向上調整法
        • 2.3.3.2 堆的向下調整算法
        • 2.3.3.3 堆的實現

1. 樹的相關概念

1.1 簡述:樹

樹是一種非線性的數據結構,其有n個有限的節點構成,樹結構具有層次性。它的形狀頗像一顆顛倒的樹,因此而被稱為樹。

補充:

  1. 樹的結構中有一個特殊的結點,其沒有前驅結點,被稱為根結點。
  2. 樹的結構中,其子樹間不能存在交集,若存在交集,那么,此結構就不能被稱為樹結構。

1.2 樹的概念補充

在這里插入圖片描述

  1. 節點的度:一個節點含有的子樹的個數稱為該節點的度;(A結點的度為3)
  2. 葉子節點:度為0的結點;(E, F, G, D, H結點)
  3. 非葉子節點:度不為0的結點(B,C, G結點)
  4. 父親節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點
  5. 子節點:一個節點含有的子樹的根節點稱為該節點的子節點;
  6. 兄弟節點:具有相同父節點的節點互稱為兄弟節點;
  7. 樹的度:一棵樹中,最大的節點的度稱為樹的度;
  8. 節點的層 :從根開始定義起,根為第1層,根的子節點為第2層,以此類推;
  9. 樹的深度 :樹中節點的最大層次;
  10. 堂兄弟結點 :雙親在同一層的節點互為堂兄弟;
  11. 祖先結點:從根到該節點所經分支上的所有節點;
  12. 子孫結點 :以某節點為根的子樹中任一節點都稱為該節點的子孫;
  13. 森林: 多棵互不相交的樹的集合

2. 二叉樹

2.1 二叉樹的概念

對于樹結構的初次學習,我們來重點學習二叉樹這一結構。

在這里插入圖片描述

由上圖可知,二叉樹具有兩個特點:

  1. 二叉樹是一個結點的集合,可能為空或者由根節點,左子樹,右子樹構成。
  2. 二叉樹由左右子樹之分,所以,二叉樹為一個有序樹,其順序不能顛倒。
  3. 二叉樹的沒有擁有超過兩個孩子結點的結點,即二叉樹的度為2
  4. 補充:特殊的二叉樹
    <1> 滿二叉樹:除葉子結點外,所有結點都有左右孩子結點,若k二叉樹的層數,那么滿二叉樹的結點就有 k 2 k^2 k2 - 1個結點。
    <2> 完全二叉樹:除最后一層外,所有結點都有左右孩子結點,最后一層葉子結點連續

在這里插入圖片描述

2.2 二叉樹的性質

  1. 若規定根節點的層數為1,則一棵非空二叉樹的第i層上最多有2^(i - 1) 個結點.
  2. 若規定根節點的層數為1,則深度為h的二叉樹的最大結點數是 2 h 2^h 2h - 1.(等比數列求和)
  3. 任何一棵二叉樹, 如果度為0其葉結點個數為n, 則其度為0的結點一定比度為2的結點多一個.
  4. 若規定根節點的層數為1,具有n個結點的滿二叉樹的深度,h = l o g 2 ( n + 1 ) log_2(n + 1) log2?(n+1)
  5. 對于具有n個結點的完全二叉樹,如果按照從上至下從左至右的數組順序對所有節點從0開始編號,則對于序號為i的結點有:
    <1> 若i>0,i位置節點的雙親序號:(i-1)/2;i=0,i為根節點編號,無雙親節點
    <2> 若2i+1<n,左孩子序號:2i+1,2i+1>=n否則無左孩子
    <3> 若2i+2<n,右孩子序號:2i+2,2i+2>=n否則無右孩子

2.3 二叉樹的存儲結構與堆

2.3.1 存儲結構

  1. 順序存儲:
    其采用的方式為使用數組進行數據的存儲,其各個結點的關系通過下標之間的數學關系來實現,在物理結構上其仍為數組,此結構只適合存儲完全二叉樹。
  2. 鏈式存儲:
    使用鏈表的方式來存儲數據,其存在三個域,數據域,左孩子指針域,右孩子指針域。在邏輯上,呈現鏈式的邏輯結構。

2.3.2 堆的概念

  1. 堆是一棵完全二叉樹。
  2. 堆分為大堆與小堆,當所有結點的值都大于孩子結點時即為大堆,當所有結點的值都小于其孩子結點時即為小堆。

2.3.3 堆的實現

  1. 因為堆都是完全二叉樹,這里我們使用順序存儲的方式來進行堆的實現。
  2. 在數組中若父親節點的下標為pos,其左孩子的下標為pos × 2 + 1,右孩子結點的下標為pos × 2 + 2,下標為0的元素為根結點。(順序存儲方式,使用數組來實現堆結構的方式)

在這里插入圖片描述

我們已經知曉了如何判斷一個數組是否為堆,可我們對下面兩個問題還是沒有辦法去解決:

  1. 當一個數組是堆時,我們如何保證在不斷向數組中插入數據而堆的結構不被打亂。
  2. 如何將一個不是堆的數組調整為堆。
  3. 如何去創建一個是堆的數組。

我們接下來進行這幾個問題的學習。

2.3.3.1 堆的向上調整法

在這里插入圖片描述

void HeapAdjustUp(int* arr, int child)
{int parent = (child - 1) / 2;while (child > 0){if (arr[parent] < arr[child]){swap(&arr[parent], &arr[child]);child = parent;parent = (child - 1) / 2;}else{break;}}
}

向上調整建堆

  1. 將數組中的元素從首元素開始一個一個視作插入已有的堆中在進行向上調整,初始堆為空。

那么,我們就可以進行如下操作:

for(int i = 0; i < n; i++)
{HeapAdjustUp(arr, i);
}
2.3.3.2 堆的向下調整算法
void HeapAdjustDown(int* arr, int n, int parent)
{//n為元素個數int child = parent * 2 + 1;while (child < n){if (child + 1 < n && arr[child] < arr[child + 1]){child++;}if (arr[parent] < arr[child]){swap(&arr[parent], &arr[child]);parent = child;child = parent * 2 + 1;}else{break;}}
}

向下調整法建堆
2. 我們從最后一個非葉子結點開始,向下調整,調整過后的子樹都為堆,一直循環到根結點。

操作如下:

過程演示:
在這里插入圖片描述

for (int j = (n - 1 - 1) / 2; j >= 0; j--)
{HeapAdjustDown(arr, n, j);
}
2.3.3.3 堆的實現

堆的結構:

typedef struct Heap
{int* data;int size;int capacity;
}Heap;

堆的初始化與銷毀:

void HeapInit(Heap* heap)
{heap->data = NULL;heap->capacity = heap->size = 0;
}void HeapDestroy(Heap* heap)
{while (heap->size){HeapPop(heap);}free(heap->data);heap->data = NULL;heap->capacity = heap->size = 0;
}

堆的元素增加與頭刪

void CheckCapacity(Heap* heap)
{if (heap->size == heap->capacity){int newcapacity = heap->capacity == 0 ? 4 : heap->capacity * 2;int* tmp = (int*)realloc(heap->data, newcapacity * sizeof(int));if (tmp == NULL){perror("malloc failed");exit(-1);}heap->data = tmp;heap->capacity = newcapacity;}
}void HeapPush(Heap* heap, int val)
{CheckCapacity(heap);heap->data[heap->size] = val;heap->size++;HeapAdjustUp(heap->data, heap->size - 1);
}//逆置首尾元素,size--,再向下調整
//向下調整后堆仍為堆的前置條件為,左右子樹都為堆
void HeapPop(Heap* heap)
{assert(!HeapEmpty(heap));swap(&heap->data[0], &heap->data[heap->size - 1]);heap->size--;//左右子樹都為堆HeapAdjustDown(heap->data, heap->size, 0);
}

返回堆頂元素與判空:

bool HeapEmpty(Heap* heap)
{return heap->size == 0;
}int HeapTop(Heap* heap)
{assert(!HeapEmpty(heap));return heap->data[0];
}

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

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

相關文章

域名及地址正確外,若依后臺無法正常加載頁面和退出報404問題

寫小程序退出的時候&#xff0c;另外寫了一個自定義退出處理類&#xff0c;里面的響應瀏覽器的代碼每次都走。因為原來也有個退出處理類&#xff0c;所以先后走了2次&#xff0c;因為就出現了問題。 LogoutSuccessHandlerImpl類里的&#xff1a; ServletUtils.renderString(r…

【C++ AVL樹】

文章目錄 AVL樹AVL樹的概念AVL樹節點的定義AVL樹的插入AVL樹的旋轉右單旋左單旋左右雙旋右左雙旋 代碼實現 總結 AVL樹 AVL樹的概念 二叉搜索樹在順序有序或接近有序的情況下&#xff0c;而插入搜索樹將退化為單叉樹&#xff0c;此時查找的時間復雜度為O(n)&#xff0c;效率低…

鴻蒙Harmony應用開發—ArkTS聲明式開發(通用屬性:顏色漸變)

設置組件的顏色漸變效果。 說明&#xff1a; 從API Version 7開始支持。后續版本如有新增內容&#xff0c;則采用上角標單獨標記該內容的起始版本。 linearGradient linearGradient(value: { angle?: number | string; direction?: GradientDirection; colors: Array; repea…

mamba-ssm安裝building wheel卡著不動后error...避坑解決方法

文章目錄 方法1、下載whl文件到本地后pip install安裝成功后驗證&#xff1a; 方法2、拉取Docker鏡像 對于項目中用到MambaIR的小伙伴&#xff0c;需要pip安裝 causal_conv1d和 mamba-ssm兩個包及其依賴&#xff1a; torch packing transformersMambaIR-Github主頁&#xff0…

【C++】vector的使用及其模擬實現

這里寫目錄標題 一、vector的介紹及使用1. vector的介紹2. 構造函數3. 遍歷方式4. 容量操作及空間增長問題5. 增刪查改6. vector二維數組 二、vector的模擬實現1. 構造函數2. 迭代器和基本接口3. reserve和resize4. push_back和pop_back5. insert和erase5. 迭代器失效問題5. 淺…

【Java】基礎算法練習題

個人簡介&#xff1a;Java領域新星創作者&#xff1b;阿里云技術博主、星級博主、專家博主&#xff1b;正在Java學習的路上摸爬滾打&#xff0c;記錄學習的過程~ 個人主頁&#xff1a;.29.的博客 學習社區&#xff1a;進去逛一逛~ 目錄 基礎算法練習題&#x1f680;1. 兩數之和…

Django 管網項目 三

Django 官網文檔 ??Writing your first Django app, part 2 | Django documentation | Django 本文內容涉及創建視圖 View&#xff0c;路由&#xff0c;和模版。并對內容進行渲染。 創建視圖 在我們的投票應用中&#xff0c;我們需要下列幾個視圖&#xff1a; 問題索引頁—…

ChatGPT支持下的PyTorch機器學習與深度學習技術應用

近年來&#xff0c;隨著AlphaGo、無人駕駛汽車、醫學影像智慧輔助診療、ImageNet競賽等熱點事件的發生&#xff0c;人工智能迎來了新一輪的發展浪潮。尤其是深度學習技術&#xff0c;在許多行業都取得了顛覆性的成果。另外&#xff0c;近年來&#xff0c;Pytorch深度學習框架受…

相關知識1111

一、 店鋪編號和相關負責人 1、天貓兄弟、錦格 京東凡越 福林哥 如萍姐 2、京東錦格 天貓凡越 林森 雷佳華 3、天貓從簡 京東從簡 孔哥 4、抖音錦格 拼多多凡越 鴻哥 不知道哪個店鋪編號&#xff1a;0 二、天貓京東聊天界面快捷搜索商品 1、 天貓只能根據標題搜索 2、京東是…

神經網絡之萬能定理python-pytorch實現,可以擬合任意曲線

神經網絡之萬能定理python-pytorch實現&#xff0c;可以擬合任意曲線 博主&#xff0c;這幾天一直在做這個曲線擬合的實驗&#xff0c;講道理&#xff0c;網上可能也有很多這方面的資料&#xff0c;但是博主其實試了很多&#xff0c;效果只能對一般的曲線還行&#xff0c;稍微…

java之抽象類

什么是抽象類&#xff1f; 抽象就是不能具體化&#xff0c;不能實例化 作為父類&#xff0c;讓子類去實現 abstract修飾類就是抽象類 abstract修飾方法就是抽象方法修飾符 abstract class 類名{修飾符 abstract 返回值類型 方法名(形參列表); }public abstract class A {//不…

CTFHUB--文件包含漏洞--RCE

文件包含漏洞 文件包含漏洞也是一種注入型漏洞&#xff0c;其本質就是輸入一段用戶能夠控制的腳本或者代碼&#xff0c;并讓服務端執行。有時候由于網站功能需求&#xff0c;會讓前端用戶選擇要包含的文件&#xff0c;而開發人員又沒有對要包含的文件進行安全考慮&#xff0c;…

CSS【詳解】居中對齊 (水平居中 vs 垂直居中)

水平居中 內部塊級元素的寬度要小于容器(父元素) 方案一&#xff1a;文本居中對齊&#xff08;內聯元素&#xff09; 限制條件&#xff1a;僅用于內聯元素 display:inline 和 display: inline-block; 給容器添加樣式 text-align:center<!DOCTYPE html> <html lang&q…

裴蜀定理(Bézout’s identity)

裴蜀定理&#xff08;Bzout’s identity&#xff09;是一個數論定理&#xff0c;也稱為貝祖等式。它表明&#xff0c;對于任意給定的兩個整數 a a a 和 b b b&#xff0c;存在整數 x x x 和 y y y&#xff0c;使得它們滿足以下方程&#xff1a; a x b y gcd ? ( a , b )…

【簡略知識】項目開發中,VO,BO,PO,DO,DTO究竟是何方妖怪?

前言 在項目開發中&#xff0c;是否需要定義VO&#xff08;視圖對象&#xff09;&#xff0c;BO&#xff08;業務對象&#xff09;&#xff0c;PO&#xff08;持久化對象&#xff09;&#xff0c;DO&#xff08;領域對象&#xff09;&#xff0c;DTO&#xff08;數據傳輸對象&…

CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION

CKKS EXPLAINED, PART 3: ENCRYPTION AND DECRYPTION Introduction 在之前的文章中&#xff0c;CKKS解釋了第二部分&#xff1a;完整的編碼和解碼&#xff0c;我們看到了如何實現CKKS的編碼器和解碼器&#xff0c;這使我們能夠將向量轉換為多項式&#xff0c;反之亦然。這一步…

笨辦法學 Python3 第五版(預覽)(三)

原文&#xff1a;Learn Python the Hard Way, 5th Edition (Early Release) 譯者&#xff1a;飛龍 協議&#xff1a;CC BY-NC-SA 4.0 練習 30&#xff1a;假如 這是你將要輸入的下一個 Python 腳本&#xff0c;它向你介紹了if語句。輸入這個代碼&#xff0c;確保它能夠完美運行…

怎么快速編輯視頻

背景&#xff1a;怎么簡單快速編輯視頻 利用FFmpeg功能&#xff0c;簡單快速編輯視頻&#xff0c;如按9:16提前剪切視頻、替換背景音樂。 下載FFmpeg&#xff1a;https://ffmpeg.org/download.html 將FFmpeg的路徑添加到環境變量中&#xff1a; Windows&#xff1a;在系統的環…

Home-credit海外貸款信貸產品源碼/線上貸款產品大全/貸款平臺軟件源碼/海外借貸平臺

測試環境&#xff1a;Linux系統CentOS7.6、寶塔、PHP7.3、MySQL5.6&#xff0c;根目錄public&#xff0c;偽靜態laravel5&#xff0c;開啟ssl證書 語言&#xff1a;中文簡體、英文 laravel框架的程序有點多&#xff0c;這個團隊估計主要就是搞laravel開發的&#xff0c;基本上…

前端架構: 腳手架通用框架封裝之腳手架注冊和命令注冊開發(教程二)

腳手架注冊和命令注冊 1 &#xff09;腳手架的注冊 接上文&#xff0c;仍舊在 abc-cli 項目中參考&#xff1a;https://blog.csdn.net/Tyro_java/article/details/136381086之前初始化的時候&#xff0c;使用的是 yargs, 現在我們想要使用 commander在cli包中安裝 commander $…