【數據結構】樹(Tree)

???專欄:數據結構? ? ?

? ? ? ? ? 🧑?🎓個人主頁:SWsunlight

目錄

?一、基本概念:

1、定義:

?編輯

?編輯

2、樹的成分:

3、樹的性質:

二、存儲方式:

?編輯

雙親表示法:

孩子表示法:

孩子兄弟表示法(左孩子右兄弟):

?三、二叉樹:

概念:

存儲方式:

1、順序存儲(順序表)?

2、鏈式存儲(鏈表)


?一、基本概念:

1、定義:

????????樹是一種非線性的數據結構,它是由n(n>=0)有限結點組成一個具有層次關系的集合。為了使其抽象變得具體、易理解,且?因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的樹


如下圖:可以將最上面想象成樹根,開始發散,然后就分化枝條 👉到最后沒有枝條(黑色線)連接的是葉子(葉子節點)??

下圖就是典型的樹結構,樹枝是不會有葉子的,所以只有分到最后一步了才是葉子;

注意:你看見過樹的枝條會和另一根枝條相交么??正常情況的樹不會的;換一個思路:可以理解為這是一個家族族譜,最上面的節點就是老祖,他生了孩子,孩子又繼續生孩子,到你這一代即(葉子)? 你想一下:家庭關系能亂掉么??要是隨便一個祖先都能相交,豈不是倫理問題了!!!亂了,一切都亂了!!!!恐怕這個世界都瘋了!!!

圖中文字很好理解吧!一個人肯定只有一個爹,當然有個例外——老祖,它的父親我們找不到,暫且沒有

總結:

樹是一種非線性的數據結構,它表現的關系是一對多

它是由n(n>=0)個結點組成的有限集,當n = 0時此時只有一個根節點,稱為空樹。

在任意一棵非空樹中應滿足:

1.有且僅有一個特殊的根節點,根節點沒有前驅結點

2.每一個非根結點有且只有一個父親結點

? ?除了根結點外,每個子結點可以分為多個不相交的子樹,并且子樹是不相交的

3.樹是遞歸定義的

4.一顆N個結點的樹有N-1條


2、樹的成分:

前言:接下里講述的各種名稱是根據選則參考系來說的(例子為開頭那張樹的圖)我們可以選整體一顆樹來論,然后在樹里面又有許多子樹

總結:任何一棵樹包含:根和子樹——>{根+N棵子樹(N>=0)};

  1. 根節點類比樹根,,沒有前驅節點,即沒有父親節點的節點,有且只有一個所有節點通過直接或間接方式都能找到此根節點。如:A就是這顆樹的根節點
  2. 節點的度一個節點含有孩子的個數(或者說子樹的個數,是我生的孩子(二代),即這個節點有幾個孩子)。? ?? ? ? 如:A的度為3 、B的度為2、E的度為0、J的度為0;
  3. 葉節點/終端節點度為0的節?,類比樹葉?????? 。? ? ? ? ? ? ????????????如:J、F、K、L、H、I
  4. 非終端節點/分支節點:度不為0的節點。? ? ? ? ? ?如:B、C、D、E、G
  5. 父親節點/雙親節點若一個節點含有子節點。? ? 如:A是B和C、D的父親
  6. 子節點/孩子節點一個節點含有子樹的根節點(有父親)。? ? ? ?如:B是A的孩子(子)節點,若是將B看成一顆子樹的根節點 那么 E是B的孩子節點
  7. 兄弟節點具有同一個父親節點(親兄弟)。? ? ? ? ? ?如:E和F是兄弟節點
  8. 堂兄弟節點:雙親節點在同一成的節點互為堂兄弟。? ? ? ? ? ? ? 如:E與G、H、I節點互為堂兄弟
  9. 節點的祖先:根節點該節點所徑分支上(唯一路徑上)的所有節點“直系親屬”)如下:紅色圈就是一個路徑,J的祖先就是E、B、A ;? 而A是所有節點的祖
  10. 子孫:以某個節點為根的子樹種,任意一個節點都是該節點(根)的子孫。? ? ? ? ? ? ? ? ?如:B的子孫包括E、F、J
  11. 樹的度:一顆樹中,最大的?節點的度生的孩子最多個數 )。? ? ? ? ? ? ? ? ? ?如:上圖的樹的度為:3
  12. 路徑和路徑長度:樹中兩個結點之間的路徑是由這兩個結點之間所經過的結點序列構成的,而路徑長度是路徑上所經過的邊的個數(就是連接線的個數)
  13. 樹的層次:從根開始定義,根結點為第1層,它的子結點為第2層,以此類推?
  14. 樹的高度/深度:
    1. ???????深度:是從根結點開始自頂向下逐層累加的
    2. 高度:是從葉結點開始自底向上逐層累加的。
    3. 樹的高度(或深度)是樹中結點的最大層數
    4. 如:上圖的高度/深度是 4(與你怎么定義層數有關,第一層你是從0開始,還是從1開始計數,建議從1開始,因為開始時初始位置為0,若是0開始初始位置就是-1了)
  15. 森林:互不不想交的樹(多棵樹/多個根節點)? ? ? ? ? ? 如:并查集

標紅的是需要重點記住的

3、樹的性質:

  • 結點數性質:樹中結點的個數 == 所有節點的度數+1(根節點)
  • 層數性質:樹的高度(層數)等于樹中最大的層數,其中每一層包括所有結點中距離根結點最遠的結點。
  • 度數性質:度為m的樹中,第i層的結點數最多為m^(i-1)。 i>=1;
  • 結點數量與高度關系:一個高度為h的m叉樹最多有? (m^h-1)/(m-1)? 個結點。同樣,一個具有n個結點的m叉樹的最小高度為? ?logm(n*(m-1)

二、存儲方式:

(1)、雙親表示法(2)孩子表示法(3)孩子兄弟表示法

雙親表示法:

我們假設以一組連續空間(數組)存儲樹的結點,同時在每個結點中,附設一個指示器指示其雙親結點到在表中的位置。也就是說,每個結點除了知道自已是誰以外,還知道它的雙親在哪里。

其中data是數據域,存儲結點的數據信息。而parent是指針域,存儲該結點的雙親在數組中的下標。

//數組大小
#define MAX_Size 100
typedef int FrDataType;//結點的結構
typedef struct Node
{FrDataType data;int parent;
}Node;
//樹的結構
typedef struct Ptree {Node a[MAX_Size];//結點數組int r;//根的位置int n;//節點數}Ptree;

這樣的存儲結構,我們可以根據結點的parent 指針找到它的雙親結點,所用的時間復雜度為0(1),當到parent為-1時,表示找到了根節點。但是要知道結點的孩子是什么,需要遍歷整個結構才行


孩子表示法:

把每個結點的孩子結點排列起來,以單鏈表作存儲結構,則n個結點n個孩子鏈表,如果是葉子結點則將此單鏈表設為空。然后n個頭指針又組成一個順序表(線性表),采用順序存儲結構,存放進一個一維數組中,如圖所示 數據A的下標為0,然后他的孩子有2個,下標分別為1和2,將1和2,存到了右邊的數組中,再為下標1和下標2找孩子結點,下標為1的孩子只有一個,放到數組,以此類推

》》》設計兩種結點結構,一個是孩子鏈表的孩子結點
其中child是數據域,用來存儲某個結點在表頭數組中的下標。next 是指針域,用來存儲指向某結點的下一個孩子結點的指針


另一個是表頭數組的表頭結點

其中data是數據域,存儲某結點的數據信息。firstchild 是頭指針域存儲該結點孩子鏈表的頭指針

//樹的孩子表示法結構定義
#define MAX_SIZE 100
typedef int FrDataType;
//孩子結點
typedef struct Node {int child;//記錄每個孩子下標struct Node* next;
}*ChildPtr;
//表頭結點
typedef struct {FrDataType data;ChildPtr firstchild;
}FrBox;
//樹結構
typedef struct Ptree{FrBox node[MAX_SIZE];//結點數組int r;//根的位置int	n;//和結點數
}Ptree;

孩子兄弟表示法(左孩子右兄弟):

前面考慮了雙親和孩子。現在考慮兄弟來做;對于樹這樣的層級結構來說,只研究結點的兄弟是不行的,我們觀察后發現,任意一棵樹, 它的結點第一個孩子如果存在就是唯一的B它的右兄弟(“兄弟”是兄弟節點不是堂兄)如果存在也是唯一的;

?結構如下:child指向左邊的第一個孩子,這么理解:后面我(父親)陸續的生娃,第二個娃交給老大帶,第三的娃交給老二帶(A的生的第一個娃就是B,后面又生了娃C,娃C就是娃B的右兄弟,C交給B來帶B->C,沒有兄弟了就指向NULL)依次類推:

?結構如下:


//左孩子右兄弟法  樹的定義
typedef int TrDataType;
typedef struct TreeNode
{TrDataType val;//數據struct TreeNode* leftchild;//左孩子struct TreeNode* rightBrother;//右兄弟}TreeNode;

這個其實就是二樹,我們用這個方法將其變成了二叉樹

?三、二叉樹:

概念:

? 定義:二叉樹是另一種樹形結構,其特點是每個結點至多只有兩棵子樹( 即二叉樹中不存在度大于2的結點),并且二叉樹的子樹有左右之分,其次序不能任意顛倒,所以說是一顆有序樹;
與樹相似,二叉樹也以遞歸的形式定義。二叉樹是n (n≥0) 個結點的有限集合

二叉樹的組成均由以下幾種情況復合完成

?特殊的二叉樹

滿二叉樹:每一個層的結點數都達到最大值 (滿二叉樹是一種特殊的完全二叉樹)

完全二叉樹:完全二叉樹是效率很高的數據結構,完全二叉樹是由滿二叉樹而引出來的。


二叉排序樹:左子樹上所有結點的關鍵字均小于根結點的關鍵字;右子樹上的所有結點的關鍵字均大于根結點的關鍵字;左子樹和右子樹又各是一棵二叉排序樹。


平衡二叉樹:樹上任一結點的左子樹和右子樹的深度之差不超過1。


?斜樹:所有的節點都只有左或者右子樹

二叉樹的性質:
任意一棵樹,若結點數量為n,則邊的數量為n ? 1。
非空二叉樹上的葉子結點數等于度為2的結點數加1,即no = n2 + 1 。
非空二叉樹上第k層上至多有2k ? 1個結點( k ≥ 1 ) 。
高度為h的二叉樹至多有2 h? 1個結點( h ≥ 1 ) 。
對完全二叉樹按從上到下、從左到右的順序依次編號1 , 2… ? , n 1,2…*,n1,2…?,n,則有以下關系:
i > 1時,結點i的雙親的編號為i / 2,即當i 為偶數時, 它是雙親的左孩子;當i為奇數時,它是雙親的右孩子。
當2i ≤ n 時,結點i的左孩子編號為2i 否則無左孩子。
當2i + 1 ≤ n 時,結點i的右孩子編號為2i + 1,否則無右孩子。
結點i所在層次(深度)為{ l o g 2 i } +1。
具有n個( n > 0 ) 結點的完全二叉樹的高度為{ l o g ~2 n~ } +1。
? ? ? ? ? ? ? ? ? ? ? ??

存儲方式:

1、順序存儲(順序表)?

????????使用數組來實現,一般來說使用數組只適用于完全二叉樹;不是完全二叉樹會有空間浪費的現象現實中,一般只有堆才會使用數組;在存儲結構上是一個數組,邏輯結構上是一個完全二叉樹

? ?

2、鏈式存儲(鏈表)

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

講的不是很詳細,略微了解一下,具體的等學的更深刻了,繼續補充

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

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

相關文章

C++-float與double

float和double是兩種不同的數據類型,用于存儲浮點數(小數)。 1.精度: float是單精度浮點數,占用4個字節,通常精度為6-9位小數。 double是雙精度浮點數,占用8個字節,通常精度為15-…

Open3D 點云多平面探測(Python)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 Open3D為我們提供了一種點云多平面探測的算法,該算法使用基于魯棒統計的方法進行平面補丁檢測。該算法具體過程:首先將點云細分為更小的塊(使用八叉樹),然后嘗試為每個塊匹配一個平面。如果平面通過了魯棒平面性…

【C語言每日題解】用函數來模擬實現strlen()、strcpy()、strcmp()、strcat()

🥰歡迎關注 輕松拿捏C語言系列,來和 小哇 一起進步!? 學習了函數后,老師讓我們用函數來實現上面這四個字符串函數。 我們首先來了解一下這四個字符串函數: 1.strlen函數 用于獲取字符串長度(不包括末尾…

【源碼】相親交友系統全新UI/情感測試/婚慶中介/交友系統

【交友】相親交友系統全新UI/情感測試/婚慶中介/交友系統 帶商城,情感測試。 https://www.52codes.cc/codes/qt

從開發板導出根文件系統并修改(Ubuntu)

前面提到過基于ubuntu-base去構建根文件系統基于Ubuntu-base構建根文件系統-CSDN博客,但是有時候我們并不需要重頭開始,可以基于現有的根文件系統做調整。又或者我們直接在出廠的系統上去搭建好自己的運行環境并且編譯出自己想要的程序,現在要…

醫學科技查新中對查新點的撰寫方法!附案例講解!

我國的科技查新工作最早是從醫學領域開始的,始于1985年中國科學院醫學情報所,后來逐步發展到工、農等其 他各個領域。醫學科技查新包括立項查新和成果查新兩個部分,其中醫學立項查新,它是指在醫學科研項目申報開題之前&#xff0c…

Linux上diff命令

diff 是一個 Linux 下的命令行工具,用于比較文本文件或目錄之間的差異。它會逐行比較兩個文件的內容,并輸出它們之間的不同之處。diff 命令通常用于查找文件間的差異,特別是用于比較文件的修改,合并文件或者檢查文件的一致性。 基…

按值傳遞還是按引用傳遞

使用std::ref和std::cref 從 C11 開始&#xff0c;可以讓調用者自行決定向函數模板傳遞參數的方式。如果模板參數被聲明成 按值傳遞的&#xff0c;調用者可以使用定義在頭文件<functional>中的 std::ref()和std::cref()將參數按引用傳遞給函數模板&#xff0c;比如&#…

上海初中生古詩文大會倒計時4個月:單選題真題示例和獨家解析

現在距離2024年初中生古詩文大會還有4個多月時間&#xff0c;備考要趁早&#xff0c;因為知識點還是相對比較多的。這些知識點對于初中語文的學習也是很有幫助的。 今天我們繼續來看10道選擇題真題和詳細解析&#xff0c;以下題目截取自我獨家制作的在線真題集&#xff0c;都是…

取名時,要考慮生肖的影響

親愛的寶寶們&#xff0c;又是一年五一小長假&#xff0c;峰民想大家都在休假吧&#xff01;真幸福&#xff01;峰民每天都在工作&#xff0c;幾乎沒有休過假&#xff0c;因為每天全國各地找我們取名改名客戶是絡繹不絕&#xff0c;峰民雖然也很辛勞&#xff0c;但也很有成就感…

Redis:hash數據類型

文章目錄 hash常用命令hsethgethexistshdelhkeyshvalshmget 壓縮hash和string 本篇總結的是&#xff0c;在Redis中的哈希數據類型 hash 在Redis內部本身&#xff0c;其實就是一種鍵值對的結構&#xff0c;而在key-value的value本身&#xff0c;其實也可以是一種哈希結構 而在…

【c++算法篇】滑動窗口

&#x1f525;個人主頁&#xff1a;Quitecoder &#x1f525;專欄&#xff1a;算法筆記倉 目錄 1.長度最小的子數組2.無重復字符的最長子串3.最大連續1的個數 III4.將 x 減到 0 的最小操作數5.水果成籃6.找到字符串中所有字母異位詞7.串聯所有單詞的子串8.最小覆蓋子串 滑動窗…

李宏毅-Self-attention機制詳解

原視頻鏈接&#xff1a;attention 一. 基本問題分析 1. 模型的input 無論是預測視頻觀看人數還是圖像處理&#xff0c;輸入都可以看作是一個向量&#xff0c;輸出是一個數值或類別。然而&#xff0c;若輸入是一系列向量&#xff0c;長度可能會不同&#xff0c;例如把句子里的…

C 深入指針(4)

目錄 一、字符指針變量 1 初始化 2 與字符串數組的區別 二、數組指針變量 1 初始化 2 二維數組傳參本質 三、函數指針變量 1 初始化 2 用法 四、typedef關鍵字 五、函數指針數組 一、字符指針變量 1 初始化 //VS2022 x64 #include <stdio.h> int main() {…

機器人非線性阻抗控制系統

機器人非線性控制系統本質上是一個復雜的控制系統&#xff0c;其狀態變量和輸出變量相對于輸入變量的運動特性不能用線性關系來描述。這種系統的形成基于兩類原因&#xff1a;一是被控系統中包含有不能忽略的非線性因素&#xff0c;二是為提高控制性能或簡化控制系統結構而人為…

人形機器人場景應用全解析,2024睿抗 AI ROBOT創新挑戰賽火熱報名中!

人工智能&#xff08;AI&#xff09;已成為推動科技革命和產業變革的關鍵力量。隨著大模型等AIGC技術的迅猛發展&#xff0c;AI正深刻改變我們的生活并重新定義生產方式。越來越多人期望將AI技術從純粹的思維和計算擴展到與物理世界的互動中&#xff0c;即發展具身智能。 為了推…

探索中國文本到視頻AI模型——Vidu

引言 隨著人工智能技術的不斷進步&#xff0c;我們見證了從文本到視頻內容生成的革命。最近&#xff0c;一個名為Vidu的中國文本到視頻AI模型引起了全球的關注。由清華大學和中國AI初創公司聲書科技聯合開發的Vidu&#xff0c;于2024年4月27日宣布&#xff0c;它聲稱能夠生成高…

測試周期記錄

測試周期是軟件開發生命周期中的一個重要環節&#xff0c;它包括單元測試、集成測試、系統測試和驗收測試等階段。本文將詳細介紹測試周期的各個階段及其重要性&#xff0c;幫助讀者更好地理解測試周期在軟件開發過程中的作用。 一、單元測試 單元測試是測試周期中的第一個階段…

個人工控方面收藏網址記錄(持續更新中)

1、OPC類 OPC Foundation GitHub Downloads - Unified Automation (unified-automation.com) 物聯網IoT協議之OPC UA快速入門教程 | 源碼先生的調試人生 (debugself.com) OPC Servers - OPC UA Migration - 100 Solutions by Matrikon (matrikonopc.com) Prosys OPC UA Simu…

k8s coredns配置

1.coredns可根據集群具體數量修改pod數&#xff0c;官方推薦比例為5/1&#xff0c;即有15臺服務器最好是3個pod。 2.coredns會繼承pod所在主機的dns解析,修改了主機的dns解析之后&#xff0c;coredns有一段時間的緩存&#xff0c;重啟coredns才會在集群內部立刻生效該解析。 …