【數據結構】樹和二叉樹

一、樹的概念及結構

1、樹的概念

是一種非線性的數據結構,它是由n(n>=0)個有限結點組成一個具有層次關系的集合。把它叫做樹是因 為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。
  • 有一個特殊的結點,稱為根結點,根節點沒有前驅結點。
  • 除根節點外,其余結點被分成M(M>0)個互不相交的集合T1、T2、……、Tm,其中每一個集合 Ti (1<= i <= m) 又是一棵結構與樹類似的子樹。每棵子樹的根結點有且只有一個前驅,可以有0個或多個后繼
  • 因此,樹是遞歸定義的

現實生活中的樹:???????????????????????????????????????????????????????數據結構中的樹:

注意樹形結構中,子樹之間不能有交集,否則就不是樹形結構。


2、樹的相關概念

  • 節點的一個節點含有的子樹的個數稱為該節點的度; 如上圖:A 的度為 6。
  • 葉節點或終端節點度為 0 的節點稱為葉節點; 如上圖:B、C、H、I...等節點為葉節點。
  • 非終端節點或分支節點度不為 0 的節點; 如上圖:D、E、F、G...等節點為分支節點。
  • 雙親節點或父節點:若一個節點含有子節點,則這個節點稱為其子節點的父節點; 如上圖:A 是 B 的父節點。
  • 孩子節點或子節點:一個節點含有的子樹的根節點稱為該節點的子節點; 如上圖:B是A的孩子節點。
  • 兄弟節點具有相同父節點的節點互稱為兄弟節點; 如上圖:B、C 是兄弟節點。
  • 樹的度一棵樹中,最大的節點的度稱為樹的度; 如上圖:樹的度為 6。
  • 節點的層次:從根開始定義起,根為第1層,根的子節點為第 2 層,以此類推。
  • 樹的高度或深度樹中節點的最大層次; 如上圖:樹的高度為 4。
  • 堂兄弟節點:雙親在同一層的節點互為堂兄弟;如上圖:H、I互為兄弟節點。
  • 節點的祖先:從根到該節點所經分支上的所有節點;如上圖:A 是所有節點的祖先。
  • 子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。如上圖:所有節點都是 A 的子孫。
  • 森林:由m(m>0)棵互不相交的樹的集合稱為森林。

3、樹的表示

樹結構相對線性表比較復雜,要存儲表示起來就比較麻煩。既然保存值域,也要保存結點和結點之間 的關系,實際中樹有很多種表示方式如:雙親表示法,孩子表示法、孩子雙親表示法以及孩子兄弟表示法等。我們這里就簡單的了解其中最常用的孩子兄弟表示法
// 孩子兄弟表示法
typedef int DataType;
struct Node
{struct Node* firstChild1; // 第一個孩子結點struct Node* pNextBrother; // 指向其下一個兄弟結點DataType data; // 結點中的數據域
};


4、樹在實際中的運用(表示文件系統的目錄樹結構)


二、二叉樹的概念及結構

1、概念

一棵二叉樹是結點的一個有限集合,該集合:
  1. 或者為空
  2. 由一個根節點加上兩棵別稱為左子樹和右子樹的二叉樹組成

從上圖可以看出:
  1. 二叉樹不存在度大于 2 的結點
  2. 二叉樹的子樹有左右之分,次序不能顛倒,因此二叉樹是有序樹
注意:對于任意的二叉樹都是由以下幾種情況復合而成的:

2、現實生活中的二叉樹


3、特殊的二叉樹

  1. 滿二叉樹:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為 K結點總數是 2^K-1,則它就是滿二叉樹。

  2. 完全二叉樹完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。對于深度為?K 的,有 n?個結點的二叉樹,當且僅當其每一個結點都與深度為?K?的滿二叉樹中編號從?1?至?n?的結點一一對應時稱之為完全二叉樹。 要注意的是滿二叉樹是一種特殊的完全二叉樹前 K?層都是滿的,最后一層不一定滿,但最后一層從左到右必須是連續的。深度為 K?的完全二叉樹的節點個數最多為 2^K?- 1最少為 2^(K-1) - 1 + 1(前 K 層結點個數總和 +1,因為第 K 層至少有一個結點),所以節點個數范圍是:[ 2K-1, 2K?- 1 ]


4、二叉樹的性質?

  1. 若規定根節點的層數為?1,則一棵非空二叉樹的第 i 層最多有 2^(i-1)?個結點
  2. 若規定根節點的層數為?1,則深度為?h?二叉樹的最大結點數是 2^h-1
  3. 對任何一棵二叉樹, 如果度為?0?其葉結點個數為 n?, 度為?2?的分支結點個數為 m?,則有?n= m+1
  4. 若規定根節點的層數為?1,具有?n?個結點的滿二叉樹的深度h= log(n+1). (ps:log(n+1)是?log?以?2 為底,n+1 為對數)。
  5. 對于具有?n?個結點的完全二叉樹,如果按照從上至下從左至右的數組順序對所有節點從 0 開始編號,則對于序號為 i 的結點有: ??????????????

?

  • 若?i>0i 位置節點的雙親序號:(i-1)/2;i=0,i?為根節點編號,無雙親節點。
  • 若?2i+1<n,左孩子序號:2i+1,2i+1>=n 否則無左孩子。
  • 若?2i+2<n,右孩子序號:2i+2,2i+2>=n 否則無右孩子。

5、二叉樹的存儲結構

二叉樹一般可以使用兩種結構存儲,一種順序結構,一種鏈式結構
(1)順序存儲
順序結構存儲就是使用數組來存儲,一般使用數組只適合表示完全二叉樹。因為不是完全二叉樹會有空間的浪費。而現實中使用中只有才會使用數組來存儲。二叉樹順序存儲在物理上是一個數組,在邏輯上是一顆二叉樹。
  • leftchild = parent * 2 + 1

  • rightchild = parent * 2 + 2

  • parent = (child - 1) / 2


(2)鏈式存儲
二叉樹的鏈式存儲結構是指,用鏈表來表示一棵二叉樹,即用鏈來指示元素的邏輯關系。 通常的方法是鏈表中每個結點由三個域組成,數據域和左右指針域,左右指針分別用來給出該結點左孩子和右孩子所在的鏈結點的存儲地址 。鏈式結構又分為二叉鏈和三叉鏈。目前我們一般用到的都是二叉鏈。( 后面的 數據結構內容如紅黑樹等會用到三叉鏈)

?

typedef int BTDataType;// 二叉鏈
struct BinaryTreeNode
{struct BinaryTreeNode* left; // 指向當前節點左孩子struct BinaryTreeNode* right; // 指向當前節點右孩子BTDataType data; // 當前節點值域
}// 三叉鏈
struct BinaryTreeNode
{struct BinaryTreeNode* parent; // 指向當前節點的雙親struct BinaryTreeNode* left; // 指向當前節點左孩子struct BinaryTreeNode* right; // 指向當前節點右孩子BTDataType data; // 當前節點值域
};

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

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

相關文章

mysql8.0.3集群搭建

下載mysql安裝包&#xff1a; https://dev.mysql.com/downloads/mysql/5.7.html#downloads 準備環境 1、準備三臺服務器并設置hosts 192.168.236.143 mysql1 192.168.236.144 mysql2 192.168.236.145 mysql32、設置免密登陸 #生成秘鑰 ssh-keygen -t rsa #一直按Enter即可…

php從靜態資源到動態內容

1、從HTML到PHP demo.php:后綴由html直接改為php,實際上當前頁面已經變成了動態的php應用程序腳本 demo.php: 允許通過<?php ... ?>標簽,添加php代碼到當前腳本中 php標簽內部代碼由php.exe解釋, php標簽之外的代碼原樣輸出,仍由web服務器解析 <!DOCTYPE html>…

MySQL數據庫基礎語法

一&#xff0c;數據庫操作 數據庫中不區分大小寫&#xff01;&#xff01;&#xff01; 1.1 顯示數據庫 show databases ; 如圖&#xff1a; 1.2 創建數據庫 create database [ if not exists ]數據庫名 ; 如圖&#xff1a; 1.3 使用數據庫 use 數據庫名 &#xff1b; 如圖&a…

8月13日,每日信息差

1、600余家互聯網企業發出倡議&#xff1a;積極維護防汛救災網絡秩序、截至目前&#xff0c;包括百度、微博、抖音、快手、小紅書、嗶哩嗶哩、阿里、騰訊等8家超大型互聯網平臺在內的600余家企業發出倡議書&#xff0c;唱響了萬眾一心、聚力救災救援的網上主旋律 2、蘇州調整耗…

常見的BUG分析方法有哪些?

分類法&#xff1a;對所有的BUG進行分類&#xff0c;識別出共性的問題。 根據分析的角度不同&#xff0c;也會有不同的分類方法&#xff0c;僅供參考&#xff1a; 發生階段&#xff1a;冒煙測試、迭代測試、SIT測試、UAT測試、生產&#xff1b;根據BUG的發生階段&#xff0c;我…

使用fopen等標準C庫來操作文件

fopen 需要的頭文件&#xff1a; #include <stdio.h> 函數原型&#xff1a; FILE *fopen(const char *pathname, const char *mode); 參數&#xff1a; pathname: 文件路徑mode: “r” &#xff1a;以只讀方式打開文件&#xff0c;該文件必須存在。“w” &#xff…

騰訊出了一個新聊天軟件M8

眾所周知&#xff0c;如今國內互聯網&#xff0c;微信和QQ無疑是社交領域的霸主。 下載:https://www.123pan.com/s/BP5A-RW4xh.html 不過&#xff0c;它們也有各自局限性&#xff0c;比如難以結識新朋友、功能過于復雜等。 這讓用戶產生厭倦&#xff0c;再加上近幾年AI、元宇…

PHP之PHPExcel

include PHPExcel.php; include PHPExcel/Writer/Excel2007.php; //或者include PHPExcel/Writer/Excel5.php; 用于輸出.xls的 //創建一個excel $objPHPExcel new PHPExcel(); // 輸出Excel表格到瀏覽器下載 header(Content-Type: application/vnd.ms-excel); header(Content-…

使用requests如何實現自動登錄

不知道大家有沒有注意到&#xff0c;好多網站我們登錄過后&#xff0c;在之后的某段時間內訪問該網頁時&#xff0c;不會給出請登錄的提示&#xff0c;時間到期后就會提示請登錄&#xff01;這樣在使用爬蟲訪問網頁時還要登錄&#xff0c;打亂我們的節奏&#xff0c;那么如何使…

考研408 | 【計算機網絡】 數據鏈路層

導圖&#xff1a; 數據鏈路層概念&#xff1a; 結點&#xff1a;主機、路由器 鏈路&#xff1a;網絡中兩個結點之間的物理通道&#xff0c;鏈路的傳輸介質主要有雙絞線、光纖和微波。分為有線鏈路、無線鏈路。 數據鏈路&#xff1a;網絡中兩個結點之間的邏輯通道&#xff0…

河道水位自動監測預警 yolov5

河道水位自動監測預警系統基于yolov5網絡模型AI視頻智能水尺讀數技術&#xff0c;河道水位自動監測預警系統通過在河道周邊布設監控攝像頭&#xff0c;實時監測水位的變化&#xff0c;一旦水位超過預設閾值&#xff0c;將自動發出預警信號&#xff0c;并提示相關人員采取相應的…

Three.js 實現材質邊緣通道發光效果

相關API的使用&#xff1a; 1. EffectComposer&#xff08;渲染后處理的通用框架&#xff0c;用于將多個渲染通道&#xff08;pass&#xff09;組合在一起創建特定的視覺效果&#xff09; 2. RenderPass(是用于渲染場景的通道。它將場景和相機作為輸入&#xff0c;使用Three.…

使用script標簽解決跨域問題,但是只能使用get請求,且不需要獲取get請求的數據,例如埋點,只需要觸發后發送get請求,而不需要獲取返回的參數

在項目中&#xff0c;使用埋點的時候&#xff0c;因為使用的是外部提供的接口&#xff0c;所以直接請求的時候&#xff0c;前端會報跨域的問題&#xff0c;本著不麻煩后端的想法&#xff0c;怎怎么前端實現跨域而完全不需要后段的配合&#xff0c;這時候就想到了通過script標簽…

【簡單認識zookeeper+kafka分布式消息隊列集群的部署】

文章目錄 一、zookeeper1、定義2、工作機制3、Zookeeper 特點4、Zookeeper 數據結構5、Zookeeper 應用場景6、Zookeeper 選舉機制&#xff08;1&#xff09;第一次啟動選舉機制&#xff08;2&#xff09;非第一次啟動選舉機制 7、部署zookeeper群集 二、消息隊列概述1、為什么需…

百度云盤發展歷程與影響

摘要&#xff1a; 百度云盤作為中國領先的云存儲與共享服務提供商&#xff0c;自其創立至今經歷了多個階段的發展與變革。本論文通過對百度云盤的歷史回顧與分析&#xff0c;探討了其在技術、商業模式、用戶體驗以及對社會的影響等方面的演變。同時&#xff0c;還分析了在競爭激…

使用luarocks安裝cjson并使用cjson

1.luarocks安裝 wget https://luarocks.org/releases/luarocks-3.3.1.tar.gz --no-check-certificatels -lrthtar -xvf luarocks-3.3.1.tar.gz mv luarocks-3.3.1 /usr/local/cd /usr/local/luarocks-3.3.1/./configure --prefix/usr/local/luarocks-3.3.1 vim /etc/profilePAT…

Mac下??Git如何下載/上傳遠程倉庫

使用終端檢查電腦是否安裝Git git --version 通過此文章安裝Git ?? ???????傳送門&#x1f310; 方式1??使用終端操作 1.下載——克隆遠程倉庫到本地 git clone [遠程地址] 例&#xff1a;git clone https://gitee.com/lcannal/movie.git? 2.編…

Windows - UWP - 為UWP應用創建桌面快捷方式

Windows - UWP - 為UWP應用創建桌面快捷方式 前言 這是一個較為簡單的方式&#xff0c;不需要過多的命令行。 How 首先Win R -> shell:AppsFolder -> 回車&#xff0c; 這將顯示電腦上的已安裝應用&#xff08;Win32 & UWP&#xff09;&#xff1a; 找到想要創建…

【Nginx】Nginx負載均衡

負載均衡&#xff1a;通過反向代理來實現 Nginx的七層代理和四層代理&#xff1a; 七層是最常用的反向代理方式&#xff0c;只能配置在nginx配置文件的http模塊當中 &#xff1b;配置的方法名稱為&#xff1a;upstream模塊&#xff0c;不能寫在server中也不能寫在location中&a…

ZABBIX 6.4的完全安裝步驟

此安裝文檔是我一步一步的驗證過的&#xff0c;按步驟來可以順暢的安成ZABBIX6.4的部署。 Zabbix 主要有以下幾個組件組成&#xff1a; Zabbix Server6.4&#xff1a;Zabbix 服務端&#xff0c;是 Zabbix 的核心組件。它負責接收監控數據并觸發告警&#xff0c;還負責將監控數…