數據結構--《二叉樹》

二叉樹

1、什么是二叉樹

二叉樹(Binar Tree)是n(n>=0)個結點的優先集合,該集合或者為空集(稱為空二叉樹),或者由一個根結點和兩顆互不相交的、分別稱為根結點的左子樹和右子樹的二叉樹構成。

這里給張圖,能更直觀的感受二叉樹:

? 2、二叉樹的特點

從上圖可以看出二叉樹的幾個特點:

  1. 二叉樹不存在度大于2的結點,每個結點最多有兩顆子樹;
  2. 左子樹和右子樹是有順序的,次序不能顛倒;
  3. 即使樹中的某個結點只有一顆子樹,那也要區分它是左子樹還是右子樹。

講到這那就不得不提及二叉樹的五種基本形態:

  1. 空二叉樹;
  2. 只有一個根節點;
  3. 根結點只有左子樹;
  4. 根結點只有右子樹;
  5. 根結點既有左子樹又有右子樹。

?

如下圖所示,這棵樹就不符合二叉樹的條件,所以它就不是一顆二叉樹。

?

3、幾種特殊的二叉樹

  1. 斜樹:顧名思義,斜樹一定是要斜的,但是往哪斜是有講究的。所有結點只有左子樹的二叉樹叫左斜樹。所有結點只有右子樹的二叉樹叫右斜樹。這兩者統稱為斜樹。
  2. 滿二叉樹:在一棵二叉樹中,如果所有分支結點都存在左子樹和右子樹,并且所有葉子都在同一層上,這樣的二叉樹稱為滿二叉樹。
  3. 完全二叉樹:完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。對于深度為K的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為K的滿二叉樹中編從1n的結點一一對應時稱之為完全二叉樹。 要注意的是滿二叉樹是一種特殊的完全二叉樹。

?

4、二叉樹的性質

4.1 滿二叉樹的性質

  1. 葉子只能出現在最下一層。出現在其他層就不可能達到平衡;
  2. 非葉子節點的度一定是2,否則就是“缺胳膊少腿”了;
  3. 在同樣深度的二叉樹中,滿二叉樹的結點個數最多,葉子最多。

4.2 完全二叉樹的性質

  1. 葉子結點只能出現在最下兩層;
  2. 最下層的葉子一定集中在左部連續位置;
  3. 倒數兩層,若有葉子結點,一定都在右部連續位置;
  4. 如果結點度為1,則該結點只有左孩子,即不存在只有右孩子的情況;
  5. 同樣結點數的二叉樹,完全二叉樹的深度最小。

4.3 二叉樹的性質

  1. 若規定根節點的層數為 1 ,則一棵非空二叉樹的 i 層上最多有2^(i-1)?個結點.
  2. 若規定根節點的層數為1,則深度為h的二叉樹的最大結點數是2^h - 1.
  3. 若規定根節點的層數為 1 ,具有 n 個結點的滿二叉樹的深度 h= log2(n+1). (ps:是log 2 為底,n+1 為對數 ).
  4. 對于具有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否則無右孩子
  5. 對任何一棵二叉樹, 如果度為 0 其葉結點個數為n0? , 度為 2 的分支結點個數為n2? , 則有 n0=n2?+ 1.

5、現實中的二叉樹

6、二叉樹的存儲結構

二叉樹一般可以使用兩種存儲結構,一種是順序存儲結構,另一種則是鏈式存儲結構。?

6.1 順序存儲結構

二叉樹的順序存儲結構計算用一個一維數組存儲二叉樹中的結點。一般使用數組只適合表示完全二叉樹,因為不是完全二叉樹會有空間的浪費。而現實中使用中只有堆才會使用數組來存儲。

6.2 鏈式存儲結構

二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。 通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所 在的鏈結點的存儲地址 。鏈式結構又分為二叉鏈和三叉鏈。

?

typedef int BTDataType;
// 二叉鏈
struct BinaryTreeNode
{struct BinTreeNode* _pLeft; // 指向當前節點左孩子struct BinTreeNode* _pRight; // 指向當前節點右孩子BTDataType _data; // 當前節點值域
}
// 三叉鏈
struct BinaryTreeNode
{struct BinTreeNode* _pParent; // 指向當前節點的雙親struct BinTreeNode* _pLeft; // 指向當前節點左孩子struct BinTreeNode* _pRight; // 指向當前節點右孩子BTDataType _data; // 當前節點值域
};

?

7、二叉樹的順序存儲結構

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

7.1 堆的概念和結構

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

?

?

7.2 堆的實現

?實現堆的接口函數:
?

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<stdbool.h>
#include<time.h>
#include<string.h>typedef int HPDataType;
typedef struct Heap
{//數組存儲HPDataType* a;	//數組int size;	//數據的個數int capacity;	//數組長度
}HP;//初始化
void HeapInit(HP* php);//釋放空間
void HeapDestory(HP* php);//插入數據
void HeapPush(HP* php, HPDataType x);//打印數據
void HeapPrint(HP* php);//刪除數據
void HeapPop(HP* php);//獲取第一個數據
HPDataType HeapTop(HP* php);//判斷是否為空
bool HeapEmpty(HP* php);

函數的具體實現

#define _CRT_SECURE_NO_WARNINGS 1
#include"Heap.h"//初始化
void HeapInit(HP* php)
{assert(php);php->a = NULL;php->size = php->capacity = 0;
}//釋放空間
void HeapDestory(HP* php)
{assert(php);free(php->a);php->a = NULL;php->size = php->capacity = 0;
}//交換數據
void Swap(HPDataType* x, HPDataType* y)
{HPDataType tmp = *x;*x = *y;*y = tmp;
}//結點向上調整 -- 小堆
void AdJustUp(HPDataType* a, int child)
{int parent = (child - 1) / 2;//循環判定條件為孩子結點下標大于0while (child > 0){	//如果孩子結點值小于父親節點就相互交換if (a[child] > a[parent]){Swap(&a[child], &a[parent]);child = parent;parent = (parent - 1) / 2;}//如果孩子結點值大于或等于父親節點值就直接跳出循環else{break;}}}//向下調整
void AdJustDown(HPDataType* a, int n, int parent)
{int child = 2 * parent + 1;while (child < n ){//找出左孩子和右孩子中較小的那個if (child+1 < n && a[child + 1] > a[child]){++child;}if (a[child] > a[parent]){Swap(&a[child], &a[parent]);//繼續向下調整parent = child; child = 2 * parent + 1;}else{break;}}
}//插入數據
void HeapPush(HP* php, HPDataType x)
{assert(php);//擴容if (php->capacity == php->size){int newcapacity = php->capacity == 0 ? 4 : 2 * php->capacity;HPDataType* tmp = (HPDataType*)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);
}//打印數據
void HeapPrint(HP* php)
{assert(php);for (int i = 0; i < php->size; i++){printf("%d ", php->a[i]);}
}//刪除數據
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);
}//獲取第一個數據
HPDataType HeapTop(HP* php)
{assert(php);assert(php->size > 0);return php->a[0];
}//判斷是否為空
bool HeapEmpty(HP* php)
{assert(php);return php->size == 0;
}

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

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

相關文章

GDPU JavaWeb mvc模式

搭建一個mvc框架的小實例。 簡易計算器 有一個名為inputNumber.jsp的頁面提供一個表單&#xff0c;用戶可以通過表單輸入兩個數和運算符號提交給Servlet控制器&#xff1b;由名為ComputerBean.java生成的JavaBean負責存儲運算數、運算符號和運算結果&#xff0c;由名為handleCo…

C#中獲取FTP服務器文件

1、從ftp下載pdf的方法 public static void DownloadPdfFileFromFtp(string ftpUrl,string user,string password string localPath) { // 創建FtpWebRequest對象 FtpWebRequest request (FtpWebRequest)WebRequest.Create(ftpUrl); request.Method WebRequestMethods.Ftp…

簡單好用的文本識別方法--付費的好用,免費的更有性價比-記筆記

文章目錄 先說付費的進入真題&#xff0c;免費的來喏&#xff01;PixPin微信 先說付費的 直達網址!!! 進入真題&#xff0c;免費的來喏&#xff01; PixPin 商店里就有 使用示例&#xff1a; 可以看到&#xff1a;貼在桌面上的圖片可以復制圖片中的文字&#xff0c;真的很…

深入了解ASPICE標準:提升汽車軟件開發與質量管理的利器

隨著汽車行業的快速發展和技術創新&#xff0c;汽車軟件的開發和質量管理的重視程度不斷提升。ASPICE&#xff08;Automotive Software Process Improvement and Capability Determination&#xff09;標準作為一種專門針對汽車軟件開發過程的改進和能力評定的框架&#xff0c;…

Springboot+Vue+ElementUI開發前后端分離的員工管理系統01--系統介紹

項目介紹 springboot_vue_emp是一個基于SpringbootVueElementUI實現的前后端分離的員工管理系統 功能涵蓋&#xff1a; 系統管理&#xff1a;用戶管理、角色管理、菜單管理、字典管理、部門管理出勤管理&#xff1a;請假管理、考勤統計、工資發放、工資統計、離職申請、個人資…

8.Redis之hash類型

1.hash類型的基本介紹 哈希表[之前學過的所有數據結構中,最最重要的] 1.日常開發中,出場頻率非常高. 2.面試中,非常重要的考點, Redis 自身已經是鍵值對結構了Redis 自身的鍵值對就是通過 哈希 的方式來組織的 把 key 這一層組織完成之后, 到了 value 這一層~~ value 的其中…

最重要的時間表示,柯橋外貿俄語小班課

в第四格 1、與表示“鐘點”的數詞詞組連用 例&#xff1a; в шесть часов утра 在早上六點 в пять тридцать 在五點半 2、與表示“星期”的名詞連用 例&#xff1a; в пятницу 在周五 в следующий понедельник …

包和依賴管理:Python的pip和conda使用指南

包和依賴管理&#xff1a;Python的pip和conda使用指南 對于Python新手來說&#xff0c;包和依賴管理可能是一個令人困惑的概念。但不用擔心&#xff0c;本文將用淺顯易懂的語言&#xff0c;詳細介紹如何使用Python的兩個主要包管理工具&#xff1a;pip和conda。我們還會探討在安…

為 AWS 子賬戶添加安全組修改權限

文章目錄 步驟 1&#xff1a;創建 IAM 策略步驟 2&#xff1a;附加策略到子賬戶步驟 3&#xff1a;驗證權限 本文檔將操作如何為 AWS 子賬戶&#xff08;IAM 用戶或角色&#xff09;添加修改安全組的權限&#xff0c;包括 AuthorizeSecurityGroupIngress 和 RevokeSecurityGr…

解決uniApp 中不能直接使用 Axios 的問題

最近在使用 uniapp 進行小程序開發的時候&#xff0c;發現 uniapp 不能直接使用 axios&#xff0c;需要自己進行封裝一個 http 庫使用&#xff0c;于是有了這個項目。 項目地址&#xff1a;https://www.npmjs.com/package/uni-app-wxnetwork-tool 該包的功能介紹&#xff1a; u…

String類為什么設計成不可變的?

目錄 緩存 安全性 線程安全 hashCode緩存 性能 其實這個問題我們可以通過緩存、安全性、線程安全和性能幾個維度去解析。 緩存 字符串是Java最常用的數據結構&#xff0c;我們都知道字符串大量創建是非常耗費資源的&#xff0c;所以Java中就將String設計為帶有緩存的功能…

軟考 系統架構設計師之考試感悟2

接前一篇文章&#xff1a;軟考 系統架構設計師之考試感悟 今天是2024年5月25號&#xff0c;是個人第二次參加軟考系統架構師考試的正日子。和上次一樣&#xff0c;考了一天&#xff0c;身心俱疲。天是陰的&#xff0c;心是沉的&#xff0c;感覺比上一次更加沉重。仍然有諸多感悟…

express框架下后端獲取req.body報錯undefined

express框架下后端獲取req.body報錯undefined_express服務器post中data為undefine-CSDN博客 /*** 特殊說明&#xff1a;Express是一個單線程服務器器程序【必須存在指定的順序調用,否則無法達到預期的效果】*//*** 第一步&#xff1a;創建一個Express實例對象,并且在匹配路由之…

【python】python tkinter 計算器GUI版本(模仿windows計算器 源碼)【獨一無二】

&#x1f449;博__主&#x1f448;&#xff1a;米碼收割機 &#x1f449;技__能&#x1f448;&#xff1a;C/Python語言 &#x1f449;公眾號&#x1f448;&#xff1a;測試開發自動化【獲取源碼商業合作】 &#x1f449;榮__譽&#x1f448;&#xff1a;阿里云博客專家博主、5…

17.分類問題

機器學習分類問題詳解與實戰 介紹 在機器學習中&#xff0c;分類問題是一類常見的監督學習任務&#xff0c;其目標是根據輸入特征將數據樣本劃分為預先定義的類別之一。分類問題廣泛應用于各個領域&#xff0c;如圖像識別、自然語言處理、金融風險評估等。本文將詳細介紹機器…

Spring Cloud 項目中使用 Swagger

Spring Cloud 項目中使用 Swagger 關于方案的選擇 在 Spring Cloud 項目中使用 Swagger 有以下 4 種方式&#xff1a; 方式一 &#xff1a;在網關處引入 Swagger &#xff0c;去聚合各個微服務的 Swagger。未來是訪問網關的 Swagger 原生界面。 方式二 &#xff1a;在網關處引…

RedHat9 | DNS剖析-配置輔助DNS服務器

一、實驗環境 1、輔助域名DNS服務器 DNS通過劃分為若干個區域進行管理&#xff0c;每一個區域由1臺或多臺DNS服務器負責解析&#xff0c;如果僅僅采用1臺DNS服務器&#xff0c;在DNS服務器出現故障后&#xff0c;用戶將無法完成解析。 輔助DNS服務器的優點 容災備份&#x…

區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測

區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測 目錄 區間預測 | Matlab實現DNN-KDE深度神經網絡結合核密度估計多置信區間多變量回歸區間預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 1.Matlab實現DNN-KDE深度神經網絡結合…

MySQL數據處理增刪改

數據處理增刪改DML 由于約束&#xff0c;以下操作都有可能執行失敗&#xff08;后面講約束&#xff09; 插入數據 INSERT 基礎添加&#xff1a;VALUES 值的順序必須和表中字段順序相同 INSERT INTO class VALUES(1,王小,10); 向指定字段添加&#xff1a; 值的順序和指定…

rocketmq初識

package com.ldj.rocketmq.producer;import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.apache.rocketmq.common.message.Message;import java.nio.charset.StandardCharsets;/*** User: ldj* Date: 2024/3/26* Time: 2:26* Description: 單向消息生產…