【筆記】樹(Tree)

一、樹的基本概念

1、樹的簡介

之前我們都是在談論一對一的線性數據結構,可現實中也有很多一對多的情況需要處理,所以我們就需要一種能實現一對多的數據結構--“樹”。

2、樹的定義

樹(Tree)是一種非線性的數據結構,它是n(n >= 0)個結點組成的一個具有層次關系的有限集。之所以把它叫做樹是因為它看起來像一顆倒掛的樹,也就是它的根是朝上,而葉子是朝上的。

在n=0時稱為空樹。在任意一顆非空樹中:

  1. 有且僅有一個特定的稱為根(Root)的結點;
  2. 當n>1時,其余結點可分為m(m > 0)個互不相交的有限集T1、T2、...... 、Tm,其中每一個集合本身又是一棵樹,并且稱為根的子樹(SubTree)。

注意:在樹型結構中,子樹之間不能有交集,否則就不能是樹形結構。?如果相交了,那就是圖。

3、樹的一些基本術語

就拿這張圖來舉例子

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

二、樹的存儲結構

提及存儲結構,那必然會想到兩種常用的存儲結構。一個是順序存儲結構,另一個則是鏈式存儲結構。這兩個存儲結構在我們之前學習其他的數據結構中也學習過。

樹結構相對線性表就比較復雜了,要存儲表示起來就比較麻煩了,既要保存值域,也要保存結點和結點之間的關系。實際中樹有很多種表示方式如:雙親表示法,孩子表示法、孩子雙親表示法以及孩子兄弟表示法等。我們這里就簡單的了解雙親表示法,孩子表示法以及孩子兄弟表示法。

1、雙親表示法

我們人可能因為種種原因,沒有孩子,但無論是誰都不可能是從石頭里蹦出來的(孫悟空除外,它顯然不算是人),所以人一定就會有父母。樹這種結構也不例外,除了根結點外,其余的每個結點不一定有孩子,但一定有且一個雙親。

#define MAX_TREE_SIZE 100typedef int TElemType;              //樹結點的數據類型,目前暫定為整形typedef struct PTNode
{TElemType data;                //結點數據int parent;                    //雙親位置
}PTNode;typedef struct
{PTNode nodes[MAX_TREE_SIZE];    //結點數組    int r,n;                        //根的位置和結點數
}

這樣的存儲結構,我們根據結點的?parent指針很容易找到它的雙親結點,所用的時間復雜度為O(1)。但麻煩的是如果想要知道結點的孩紙是誰,不好意思,請遍歷整個結構才行。

2、孩子表示法

把每個結點的孩子結點排列起來,以單鏈表作為存儲結構,則n個結點有n個孩子鏈表,如果是葉子結點則此單鏈表為空。然后n個頭指針又組成一個線性表,采用順序存儲結構,存放進一個一維數組中。

?

為此,需要設計兩種結點結構,一個是孩子鏈表的孩子結點,如下表所示

其中,child是數據域,用來存儲某個結點在表頭數組中的下標;next是指針域,用來存儲指向某個結點的下一個孩子結點的指針。

另一個是表頭數組的表頭結點,如下表所示

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

#define max_TREE_SIZE 100typedef int TElemType;                //樹結點的數據類型,目前暫定為整形typedef struct CTNode                 //孩子結點
{int child;struct CTNode* next;    
} *ChildPtr;typedef strucct                        //表頭結構
{TElemType data;ChildPTr firstchild;
}CTBox;typedef struct                         //樹結構
{CTBox nodes[MAX_TREE_SIZE];        //結點數組int r,n;                           //結點位置和結點數
}CTree;

?這樣的數據結構對于我們要查找某個結點的孩子,或者找某個結點的兄弟,只需要查找這個結點的孩子單鏈表即可。對于遍歷整棵樹也是很方便的,對頭結點的數組循環即可。

但是如果想知道某個結點的雙親是誰?就需要遍歷整棵樹。所以就衍生出了將二者合二為一的方法:孩子兄弟表示法。

3、孩子兄弟表示法

typedef int DataType;
struct Node
{struct Node* _firstChild1; // 第一個孩子結點struct Node* _pNextBrother; // 指向其下一個兄弟結點DataType _data; // 結點中的數據域
};

?這種表示法,給查找某個結點的某個孩子帶來了方便,只需要通過firstchild找到此結點的長子,然后通過長子結點的nextbrother找到它的二弟,接著一直下去,直到找到具體的孩子。

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


以上就是關于樹的基本概念和存儲結構的知識點。有關二叉樹的內容會在下一個章節中再詳細描述。

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

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

相關文章

作物水文模型AquaCrop---用于評估作物對水的需求、灌溉計劃和管理策略

AquaCrop是由世界糧食及農業組織(FAO)開發的一個先進模型,旨在研究和優化農作物的水分生產效率。這個模型在全球范圍內被廣泛應用于農業水管理,特別是在制定農作物灌溉計劃和應對水資源限制方面顯示出其強大的實用性。AquaCrop 不…

如何在海豚調度器自動監測報表是否跑出數據

在數據倉庫報表開發時,有的報表依賴的表多,雖然在海豚調度任務上是跑成功,但實際上沒有跑出數據來。開發人員負責的任務和表越來越多,每天去手動檢查費時費力,不去理睬默認是成功的,等到業務或產品發現問題時,又給人一種不專業不負責的感覺。 比較好的方式是用代碼進行自…

Python知識點復習

文章目錄 Input & OutputVariables & Data typesPython字符串重復(字符串乘法)字符串和數字連接在一起print時,要強制類型轉換int為str用input()得到的用戶輸入,是str類型,如果要以int形式計算的話&#xff0c…

SkyWalking 介紹及部署

1、SkyWalking簡介2、SkyWalking的搭建 2.1 部署Elasticsearch2.2 部署SkyWalking-Server2.3 部署SkyWalking-UI3、應用接入 3.1 jar包部署方式3.2 dockerfile方式3.3 DockerFile示例4、SkyWalking UI 界面說明 4.1 儀表盤 4.1.1 APM (1)全局維度&#x…

UBUNTU22.04無法安裝nvidia-driver-550 依賴于 nvidia-dkms-550 (<= 550.54.15-1)

類似的報錯信息,就是卡在了nvidia-dkms-550無法安裝 Loading new nvidia-550.40.07 DKMS files… Building for 6.5.0-15-generic Building for architecture x86_64 Building initial module for 6.5.0-15-generic ERROR: Cannot create report: [Errno 17] File e…

前端canvas項目實戰——在線圖文編輯器(十):小地圖MiniMap(上)

目錄 前言一、 效果展示二、 實現步驟0. 行動前的思考1. 為小地圖更新「背景圖」2. 為小地圖更新「滑動窗口」2.1 獲取新的滑動窗口「寬高」2.2 獲取新的滑動窗口「位置」3. 為小地圖更新「遮罩」后記前言 上一篇博文中,我們引入了「邏輯畫布」的概念,讓整個工具的頁面看起來…

JPA 3萬字面試寶典

目錄 什么是JPA? JPA和Hibernate有什么區別? 什么是ORM(對象關系映射)? 什么是Entity?

【機器學習】在電子商務(淘*拼*京*—>抖)的應用分析

機器學習與大模型:電子商務的新引擎 一、電子商務的變革與挑戰二、機器學習與大模型的崛起三、機器學習與大模型在電子商務中的應用實踐個性化推薦精準營銷智能客服庫存管理與商品定價 四、總結與展望 隨著互聯網的飛速發展,電子商務已經成為我們生活中不…

NDIS小端口驅動(四)

NDIS中斷相關 1. 注冊和取消注冊中斷: 微型端口驅動程序調用 NdisMRegisterInterruptEx 來注冊中斷。 驅動程序分配并初始化 NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS 結構,以指定中斷特征和函數入口點,驅動程序將結構傳遞給 NdisMRegister…

【三劍客和正則表達式】

文章目錄 學習目標一、什么是三劍客1.三劍客grep2.三劍客sed3.三劍客awk4.正則過濾例子15.正則過濾例子2 總結 學習目標 1.學會使用 grep 2.學會使用 sed 3.學會使用 awk 4.學會使用正則表達式一、什么是三劍客 正則三劍客:grep sed awk 1.三劍客grep # 擅長過濾…

【MySQL精通之路】查詢優化器的使用(8)

MySQL通過影響查詢計劃評估方式的系統變量、可切換優化、優化器和索引提示以及優化器成本模型提供優化器控制。 服務器在column_statistics數據字典表中維護有關列值的直方圖統計信息(請參閱第10.9.6節“Optimizer統計信息”)。與其他數據字典表一樣&am…

#Ethereum 現貨ETF 問題匯總 轉

專題: #Ethereum 現貨ETF 問題匯總,包括了多數小伙伴們的疑問,有任何忽略請留言給我,我會補充。 1. #ETH 現貨ETF何時公布? 一般來說會在北京時間的5月24日凌晨2點至4點之間,不排除稍微延后到凌晨6點的可能…

基于大語言模型的應用

在AI領域,大語言模型已成為備受矚目的焦點,尤其在自然語言處理(NLP)領域,其應用愈發廣泛。BLM作為一種多任務語言建模方法,旨在構建一個具備多功能的強大模型。在給定文本和查詢條件下,該模型能…

【深度學習】YOLOv8訓練,交通燈目標檢測

文章目錄 一、數據處理二、環境三、訓練 一、數據處理 import traceback import xml.etree.ElementTree as ET import os import shutil import random import cv2 import numpy as np from tqdm import tqdmdef convert_annotation_to_list(xml_filepath, size_width, size_he…

海山數據庫(He3DB)代理ProxySQL使用詳解:(二)功能實測

讀寫分離實測 ProxySQL官方demo演示了三種讀寫分離的方式:使用不同的端口進行讀寫分離、使用正則表達式進行通用的讀寫分離、使用正則和digest進行更智能的讀寫分離。最后一種是針對特定業務進行的優化調整,也可將其歸結為第二種方式,下邊分…

MySQL備份與日志練習

1、創建對mysql數據庫test1的定時備份任務,頻率是每周一的2點 create database test1;crond -e0 2 * * 1 mysqldump -u root -pAdmin123 --databases test1 > /opt/test1.sql2、test1中有t1、t2、t3三張表,要求只備份t2這張表 mysqldump -u root -pA…

Python 機器學習 基礎 之 數據表示與特征工程 【單變量非線性變換 / 自動化特征選擇/利用專家知識】的簡單說明

Python 機器學習 基礎 之 數據表示與特征工程 【單變量非線性變換 / 自動化特征選擇/利用專家知識】的簡單說明 目錄 Python 機器學習 基礎 之 數據表示與特征工程 【單變量非線性變換 / 自動化特征選擇/利用專家知識】的簡單說明 一、簡單介紹 二、單變量非線性變換 三、自…

知識圖譜數據預處理筆記

知識圖譜數據預處理筆記 0. 引言1. 筆記1-1. \的轉義1-2. 特殊符號的清理1-3. 檢查結尾是否正常1-4. 檢查<>是否存在1-5. 兩端空格的清理1-6. 檢查object內容長時是否以<開始 0. 引言 最近學習知識圖譜&#xff0c;發現數據有很多問題&#xff0c;這篇筆記記錄遇到的…

軟件設計師備考筆記(九):數據庫技術基礎

文章目錄 一、基本概念二、數據模型&#xff08;一&#xff09;基本概念&#xff08;二&#xff09;E-R模型&#xff08;三&#xff09;數據模型 三、關系代數&#xff08;一&#xff09;關系數據庫的基本概念&#xff08;二&#xff09;五種基本的關系代數運算&#xff08;三&…

React hooks - forwardRef+useImperativeHandle

forwardRefuseImperativeHandle React.forwardRef用法useImperativeHandle用法第三個參數的用法 React.forwardRef與useImperativeHandle配合使用注意事項 React.forwardRef用法 1.創建一個 能夠接受到ref屬性的React 組件。 ref 用來獲取實例&#xff0c;但函數組件不存在實例…