【數據結構】非線性表----樹詳解

是一種非線性結構,它是由**n(n>=0)**個有限結點組成一個具有層次關系的集合。具有層次關系則說明它的結構不再是線性表那樣一對一,而是一對多的關系;隨著層數的增加,每一層的元素個數也在不斷變化(由上一層和該層的對應關系決定)。

關于樹的名稱的由來,是因為它的結構類型很像現實中的樹倒過來,故稱作——樹。
在這里插入圖片描述

根據樹的名稱,也對其所包含的元素進行了命名和定義。

樹的基本術語

1.結點:包含一個數據元素及若干指向其子樹的分支;

2.結點的度:一個結點擁有的子樹的數目;

3.葉子或終端結點:度為0的結點;

4.非終端結點或分支結點:度不為0的結點;

5.樹的度:樹內各結點的度的最大值;(需要注意,樹的度和結點的度的定義是有略微差異的)

除此之外,還使用人類親緣關系進行了一系列描述:(注:下圖的關系與節點名稱無關,僅代表樹的結構)
在這里插入圖片描述

6.孩子結點或子結點:結點的子樹的根稱為該結點的孩子結點或子結點;

7.雙親結點或父結點:若一個結點含有子結點,則這個結點稱為其子結點的雙親結點或父結點;

8.兄弟結點:同一個雙親的孩子之間互稱兄弟;

9.祖先結點:從根到該結點所經分支上的所有結點;

10.子孫結點:以某結點為根的子樹中任一結點都稱為該結點的子孫;

11.結點的層次:從根開始定義起,根為第一層,根的孩子為第二層。若某結點在第L層.則其子樹的根就在第L+1層;

12.堂兄弟結點:其雙親在同一層的結點互為堂兄弟;

13.樹的深度或高度:樹中結點的最大層次;

14.森林:由m(m>=0)棵互不相交的樹的集合稱為森林;

15.有序樹和無序樹:樹中結點的各子樹從左到右是有次序的,不能互換,稱該樹為有序樹,否則稱為無序樹;

16.路徑和路徑長度:路徑是由樹中的兩個結點之間的結點序列構成的。而路徑長度是路徑上所經過的邊的個數

樹的基本特征

針對樹,我們有很多可以說的點。這里我們主要從其結構特征來進行總結。

  • 任何一棵樹都是由根和子樹構成的——子樹又是一棵樹——樹是遞歸定義的

  • 樹的根結點沒有前驅;除根結點外的所有結點有且只有一個前驅(也就是一個父節點)

  • 樹中所有結點有零個或多個后繼

  • 子樹是不相交的。

  • 當不再有子樹的時候就說明該樹已經到了尾結點。

樹的公式

事實上,基于樹的數據結構,可以衍生出很多數學公式來對其進行計算,但是這里只介紹基本的兩個(其他重要的公式會在二叉樹中進行介紹)

節點數量
  • 對于一棵有 n 個節點的樹,節點數量公式為:n = I + L 其中,I 是內節點數量,L 是葉節點數量。
邊數
  • 一棵有 n 個節點的樹有 n?1 條邊。

樹的構建

樹的存儲結構主要有以下幾種方法,每種方法都有其優缺點和適用場景:

1. 父節點表示法(Parent Representation)

每個節點記錄其父節點的編號或指針。這種方法使用一個數組,其中每個元素表示節點,其值是該節點的父節點的索引。

  • 結構

    parent[i] 表示第 i 個節點的父節點
    
  • 示例

    節點:  0  1  2  3  4  5
    父節點: -1  0  0  1  1  2  (-1 表示根節點)
    
  • 優點:簡單,適合快速查找父節點。

  • 缺點:查找子節點較慢,需要遍歷整個數組。

2. 孩子表示法(Child Representation)

每個節點記錄其所有子節點。這種方法使用一個鏈表或數組,其中每個節點包含一個指向其子節點列表的指針。

  • 結構

    children[i] 表示第 i 個節點的子節點列表
    
  • 示例

    節點:   0  1  2  3  4  5
    子節點: [1,2] [3,4] [5] [] [] []
    
  • 優點:適合快速查找子節點。

  • 缺點:查找父節點較慢,需要記錄父節點指針或進行額外處理。

以上兩種方法的缺點和優點是互補的。那么是否有更為方便的方法呢?

3. 孩子兄弟表示法(Left-Child Right-Sibling Representation)

當我們需要定義很多孩子的時候,我們可以使用左孩子右兄弟的定義法

也就是說根節點只指向它的第一個孩子結點,而其他的孩子節點就交給第一個孩子節點去指向

將樹轉換為二叉樹,每個節點記錄其最左子節點和右兄弟節點。這種方法使用兩個指針,一個指向最左子節點,另一個指向右兄弟。

  • 結構

    節點: node
    左孩子: leftChild
    右兄弟: rightSibling
    
  • 示例

    節點:    0/ \1   2/ \3   4
    轉換為:
    節點:    0/  \1    2/3\4
    
  • 優點:能將任意樹轉換為二叉樹,利用二叉樹的遍歷和處理方法。

  • 缺點:需要兩個指針,內存開銷較大。

4. 鄰接表表示法(Adjacency List Representation)

通常用于存儲圖結構,但也可以用于樹。每個節點記錄其相鄰節點(即子節點和父節點)。

  • 結構

    adjList[i] 表示第 i 個節點的相鄰節點列表
    
  • 示例

    節點:   0  1  2  3  4  5
    相鄰節點: [1,2] [0,3,4] [0,5] [1] [1] [2]
    
  • 優點:適合處理樹和圖的遍歷和搜索。

  • 缺點:需要額外處理以區分子節點和父節點。

5. 鄰接矩陣表示法(Adjacency Matrix Representation)

使用一個二維數組表示節點之間的連接關系。通常用于稠密圖,但在某些情況下也可用于樹。

  • 結構

    adjMatrix[i][j] 表示節點 i 和節點 j 之間是否有邊(0 或 1)
    
  • 示例

    節點:  0  1  2  3  4  5
    鄰接矩陣:
    [0, 1, 1, 0, 0, 0]
    [1, 0, 0, 1, 1, 0]
    [1, 0, 0, 0, 0, 1]
    [0, 1, 0, 0, 0, 0]
    [0, 1, 0, 0, 0, 0]
    [0, 0, 1, 0, 0, 0]
    
  • 優點:簡單,適合快速查找任意兩個節點之間是否有邊。

  • 缺點:存儲空間開銷大,不適合稀疏樹。

這些存儲結構各有特點,選擇哪種方法主要取決于具體應用需求,例如查找子節點還是父節點更頻繁,內存開銷是否是主要考慮因素等。

樹的初始化和一些基本操作

#include <stdio.h>
#include <stdlib.h>// 定義樹節點結構
typedef struct TreeNode {int data;struct TreeNode* child1;struct TreeNode* child2;struct TreeNode* child3;struct TreeNode* child4;...
} TreeNode;//樹的初始化
TreeNode* createNode(int data)
{TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode));if(!newNode){printf("failed!\n");return NULL;}newNode->data = data;newNode->child1 = NULL;newNode->child2 = NULL;...return newNode;
}//插入、查找、遍歷...
TreeNode* insertTree(TreeNode* parent,int data);
TreeNode* findTree(TreeNode* parent,int data);
TreeNode* inorderTraversal(TreeNode* parent);
...

總結

單純的樹實際上用處不大(子節點過多)。但是對于文件系統、目錄以及某些分層過多的系統,使用的就是樹。

通常在優化的數據結構中,使用更多的是叫做二叉樹的數據結構

這是基于樹的數據結構,一個根節點只有兩個孩子結點,在下一節我們將會對二叉樹進行剖析,敬請期待。
在這里插入圖片描述

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

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

相關文章

逆向案例二十三——請求頭參數加密,某區塊鏈交易逆向

網址&#xff1a;aHR0cHM6Ly93d3cub2tsaW5rLmNvbS96aC1oYW5zL2J0Yy90eC1saXN0L3BhZ2UvNAo 抓包分析&#xff0c;發現請求頭有X-Apikey參數加密&#xff0c;其他表單和返回內容沒有加密。 直接搜索關鍵字&#xff0c;X-Apikey&#xff0c;找到疑似加密位置&#xff0c;注意這里…

零基礎學習Python(三)

1. 多重繼承 一個子類可以繼承多個父類&#xff0c;這與一些編程語言的規則不通。 如果多個父類中有同名的變量和方法&#xff0c;子類訪問的順序是按照繼承時小括號里書寫的順序進行訪問的。 可以用issubclass(B, A)方法判斷B是否為A的子類。 2. 綁定 類中的方法通過參數s…

《TF2.x強化學習手冊》P59-P65-SARSA-Q-learning

文章目錄 實現SARSA算法和對應的強化學習智能體前期準備實現步驟工作原理初始化算法流程 構建基于Q學習的智能體前期準備實現步驟工作原理SARSA 算法的收斂性&#xff1a;SARSA 適合在線學習和真實系統&#xff1a;Q 學習算法的適用性&#xff1a; 實現SARSA算法和對應的強化學…

HDC使用常見命令

HDC&#xff08;HarmonyOS Device Connector&#xff09;是為開發人員提供的用于調試的命令行工具&#xff0c;通過該工具可以在windows/linux/mac系統上與真實設備進行交互。 使用HDC前&#xff0c;需要配置相關環境變量&#xff1a; 在此電腦 > 屬性 > 高級系統設置 &g…

Git常用命令以及使用IDEA集成Gitee

目錄 一、設置用戶簽名 二、初始化本地庫 三、查看本地庫狀態 四、添加文件到暫存區 五、提交本地庫 六、修改文件 七、版本穿梭 八、Git分支 九、分支的操作 9.1、查看分支 9.2、創建分支 9.3、切換分支 9.4、合并分支 十、團隊協作 十一、Idea集成Git 11.1、配…

Github 2024-07-15 開源項目周報 Top15

根據Github Trendings的統計,本周(2024-07-15統計)共有15個項目上榜。根據開發語言中項目的數量,匯總情況如下: 開發語言項目數量Python項目5非開發語言項目4JavaScript項目3TypeScript項目2Go項目1Solidity項目1Java項目1Rust項目1免費編程學習平臺:freeCodeCamp.org 創建…

3.1-RNN存在的問題以及LSTM的結構

文章目錄 1 RNN存在的問題1.1梯度消失問題1.2梯度爆炸問題1.3梯度爆炸的對策 2梯度消失的對策——LSTM2.1輸出門2.2遺忘門2.3輸入門2.4總結2.5 LSTM梯度的流動 1 RNN存在的問題 RNN存在梯度消失和梯度爆炸的問題。 書上以下圖的這句話為例&#xff0c;進行說明&#xff1b;為了…

前瞻斷言與后瞻斷言:JavaScript 正則表達式的秘密武器

JavaScript 中的前瞻斷言&#xff08;lookahead&#xff09;和后瞻斷言&#xff08;lookbehind&#xff09;相信用過的小伙伴就知道它的威力了&#xff0c;在一些特定的需求場景下&#xff0c;可以做到四兩撥千斤的作用&#xff0c;今天讓我們來盤點一下在 JavaScript 正則表達…

昇思25天學習打卡營第14天|munger85

基于MindNLPMusicGen生成自己的個性化音樂 這個所謂的個性化的音樂就是指你輸入一段文字它會根據這個文字輸出一段音樂這個音樂是貼近于那段文字的所以叫做文生成音樂&#xff0c; 如果網絡正常的話就可以直接從下載這個模型。 那么音樂生成的有兩種方式呢有兩種方式&#xff…

【C++初階】C/C++內存管理

【C初階】C/C內存管理 &#x1f955;個人主頁&#xff1a;開敲&#x1f349; &#x1f525;所屬專欄&#xff1a;C&#x1f96d; &#x1f33c;文章目錄&#x1f33c; 1. C/C內存分布 2. C語言中動態內存管理方式&#xff1a;malloc/calloc/realloc/free 3. C內存管理方式 3…

DP學習——組合模式

學而時習之&#xff0c;溫故而知新。 組合模式 和代理模式相比 和代理模式相比&#xff0c;有點類似。引用類和被引用類都繼承于同一個接口類。 但是感覺組合模式是對代理模式的更加豐富化&#xff08;升級版、超進化&#xff09;&#xff0c;集合化或者說聚合化。 組合模…

拉格朗日乘子法和KKT條件

拉格朗日乘子法(Lagrange Multiplier) 和 KKT(Karush-Kuhn-Tucker) 條件是求解約束優化問題的重要方法&#xff0c;在有等式約束時使用拉格朗日乘子法&#xff0c;在有不等約束時使用 KKT 條件。當然&#xff0c;這兩個方法求得的結果只是必要條件&#xff0c;只有當目標函數…

ssrf復習(及ctfshow351-360)

1. SSRF 概述 服務器會根據用戶提交的URL發送一個HTTP請求。使用用戶指定的URL&#xff0c;Web應用可以獲取圖片或者文件資源等。典型的例子是百度識圖功能。 如果沒有對用戶提交URL和遠端服務器所返回的信息做合適的驗證或過濾&#xff0c;就有可能存在“請求偽造"的缺陷…

C#中錯誤與異常處理

1、錯誤和異常 如果程序運行期間發生錯誤&#xff0c;異常就會發生。異常會中止當前的程序流&#xff0c;如果不采取措施&#xff0c;程序將停止運行。 錯誤和異常是兩個不同的概念&#xff0c;但它們都與程序的穩定性和可維護性有關。 1.1、錯誤 錯誤通常是指編譯時的語法錯誤…

FPGA學習筆記(一) FPGA最小系統

文章目錄 前言一、FPGA最小系統總結 前言 今天學習下FPGA的最小系統一、FPGA最小系統 FPGA最小系統與STM32最小系統類似&#xff0c;由供電電源&#xff0c;時鐘電路晶振&#xff0c;復位和調試接口JTAG以及FLASH配置芯片組成&#xff0c;其與STM32最大的不同之處就是必須要有…

關于Hyperf高并發性能的一些配置詳解和硬件推薦

目錄 工作進程的管理 自定義配置示例&#xff08;EasySwoole&#xff09;&#xff1a; 自動生成&#xff1a; 結論&#xff1a; 集群部署與協程數的關系&#xff1a; 設置 max_coroutine 的考慮因素&#xff1a; 集群部署時的配置&#xff1a; 示例配置&#xff1a; C…

鏈表面試練習習題集(Java)

1. 思路&#xff1a; 因為楊輝三角是由二維數組構成&#xff0c;所以要先創建一個二維數組&#xff0c;如何用順序表表示二維數組&#xff0c;可以通過List<List<Interger>>來表示一個二維數組&#xff0c;可以這樣理解&#xff1a;先創建一個一維數組List&#x…

modbus slave 設備通過 網關thingsboard-gateway 將數據上傳到thingsboard云平臺

搭建thingsboard物聯網云平臺花了大量時間&#xff0c;從小白到最后搭建成功&#xff0c;折磨了好幾天&#xff0c;也感謝網友的幫助&#xff0c;提供了思路最終成功搞定&#xff0c;特此記錄。 一、thingsboard環境搭建&#xff08;Ubuntu20.04LTS&#xff09; 參考官方文檔&a…

java之 junit單元測試案例【經典版】

一 junit單元測試 1.1 單元測試作用 單元測試要滿足AIR原則&#xff0c;即 A&#xff1a; automatic 自動化&#xff1b; I: Independent 獨立性&#xff1b; R&#xff1a;Repeatable 可重復&#xff1b; 2.單元測試必須使用assert來驗證 1.2 案例1 常規單元測試 1.…

PSINS工具箱函數介紹——r2d

介紹工具箱里面r2d這個小函數的作用。 程序源碼 function deg r2d(rad) % Convert angle unit from radian to degree % % Prototype: deg r2d(rad) % Input: rad - angle in radian(s) % Output: deg - angle in degree(s) % % See also r2dm, r2dms, d2r, dm2r, dms2r% …