最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python 數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解

 更新時(shí)間:2021年09月10日 09:21:19   作者:Python碎片  
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下

數(shù)據(jù)結(jié)構(gòu)樹簡(jiǎn)介

一、樹簡(jiǎn)介

樹(Tree)是一種抽象的數(shù)據(jù)結(jié)構(gòu),是一個(gè)數(shù)據(jù)的集合,集合中的數(shù)據(jù)組成了一個(gè)樹狀結(jié)構(gòu)。例如上圖,看起來像一棵倒掛的樹,根朝上葉朝下。

樹是由n(n>=0)個(gè)節(jié)點(diǎn)組成的具有層次關(guān)系的數(shù)據(jù)集合。當(dāng) n=0 時(shí),樹中沒有節(jié)點(diǎn),稱為空樹。當(dāng) n>0 時(shí),有且僅有一個(gè)節(jié)點(diǎn)被稱為根節(jié)點(diǎn)(Root),如果 n=1 ,樹只有根節(jié)點(diǎn)一個(gè)節(jié)點(diǎn)。如果 n>1 ,除根節(jié)點(diǎn)外,將其余的節(jié)點(diǎn)分成m(m>0)個(gè)互不相交的數(shù)據(jù)集合,這 m 個(gè)集合每一個(gè)都要滿足樹的結(jié)構(gòu)(有且僅有一個(gè)根節(jié)點(diǎn)),并且這 m 棵樹都“掛”在根節(jié)點(diǎn)上,如此遞歸下去,直到所有節(jié)點(diǎn)都“掛”到這棵樹上。其中,這 m 個(gè)集合構(gòu)成的 m 棵樹都被稱為根節(jié)點(diǎn)的子樹。

在理解樹的結(jié)構(gòu)和定義時(shí),需要運(yùn)用到遞歸的思想。以下圖為例,樹的節(jié)點(diǎn)集合為 {A,B,C,D,E,F,G,H} ,n=8,根節(jié)點(diǎn)為 A ,除根節(jié)點(diǎn) A 外,其余節(jié)點(diǎn)組成了兩個(gè)(m=2)集合(m1和m2),m1集合為 {B,D,E} ,m2集合為 {C,F,G,H} 。在m1中,B 為m1的根節(jié)點(diǎn),除 B 以外,其余節(jié)點(diǎn)組成兩個(gè)集合,集合 {D} 和集合 {E} ,{D} 和 {E} 都只有一個(gè)節(jié)點(diǎn),分別構(gòu)成一棵只有一個(gè)節(jié)點(diǎn)的樹,它們“掛”在m1的根節(jié)點(diǎn) B 上,是 B 的子樹,m1構(gòu)成一棵樹,“掛”在根節(jié)點(diǎn) A 上,m1是 A 的子樹。同理,在m2中,C 為m2根節(jié)點(diǎn),其余節(jié)點(diǎn)組成三個(gè)集合 {F} 、{G} 和 {H} ......

二、樹的術(shù)語

要理解樹這種數(shù)據(jù)結(jié)構(gòu),必須先理解一些常用的術(shù)語。

樹由一個(gè)一個(gè)的節(jié)點(diǎn)組成,節(jié)點(diǎn)是構(gòu)成復(fù)雜數(shù)據(jù)結(jié)構(gòu)的基本組成單位。

1. 子節(jié)點(diǎn):又稱為孩子節(jié)點(diǎn),一個(gè)節(jié)點(diǎn)所包含的子樹的根節(jié)點(diǎn)被稱為該節(jié)點(diǎn)的子節(jié)點(diǎn)。如下圖中,節(jié)點(diǎn) B 有兩棵子樹,這兩棵子樹的根節(jié)點(diǎn)為 D 和 E ,所以 D 和 E 都是 B 的子節(jié)點(diǎn)。

2. 父節(jié)點(diǎn):又稱為父親節(jié)點(diǎn),如果一個(gè)節(jié)點(diǎn)有子節(jié)點(diǎn),則這個(gè)節(jié)點(diǎn)被稱為其子節(jié)點(diǎn)的父節(jié)點(diǎn)。如下圖中,節(jié)點(diǎn) B 有兩個(gè)子節(jié)點(diǎn) D 和 E ,則 B 是 D 的父節(jié)點(diǎn),也是 E 的父節(jié)點(diǎn)。

3. 兄弟節(jié)點(diǎn):具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)互稱為兄弟節(jié)點(diǎn)。下圖中的 D 和 E 就互為兄弟節(jié)點(diǎn)。

4. 堂兄弟節(jié)點(diǎn):如果樹的兩個(gè)節(jié)點(diǎn)深度相同,但父節(jié)點(diǎn)不同,則它們互為堂兄弟節(jié)點(diǎn)。下圖中的 D與F,D與G,D與H,D與I 都是堂兄弟節(jié)點(diǎn)關(guān)系。

5. 節(jié)點(diǎn)的祖先:從根節(jié)點(diǎn)開始,依次找到某節(jié)點(diǎn)所經(jīng)路徑上的所有節(jié)點(diǎn)都稱為該節(jié)點(diǎn)的祖先。如下圖中,節(jié)點(diǎn) J 的祖先節(jié)點(diǎn)為 A,B,D 。

6. 節(jié)點(diǎn)的子孫:以某節(jié)點(diǎn)為根的子樹中,任一節(jié)點(diǎn)都稱為該節(jié)點(diǎn)的子孫。如下圖中,節(jié)點(diǎn) C 的子孫有 F,G,H,I,M,N,O 。

7. 節(jié)點(diǎn)的層次:從根開始定義起,根為第1層,根的子節(jié)點(diǎn)為第2層,以此類推。如下圖中,根節(jié)點(diǎn) A 在第1層,節(jié)點(diǎn) M 在第4層。

8. 節(jié)點(diǎn)的深度:一個(gè)節(jié)點(diǎn)所處的層次稱為該節(jié)點(diǎn)的深度。如下圖中,根節(jié)點(diǎn) A 的深度為1,節(jié)點(diǎn) M 的深度為4 。(上面解釋堂兄弟節(jié)點(diǎn)時(shí)有用到節(jié)點(diǎn)的深度,現(xiàn)在可以回去看看)

9. 樹的深度:又稱為樹的高度,一棵樹中,最大的節(jié)點(diǎn)深度稱為樹的深度。如下圖中的樹深度為4。

關(guān)于深度和高度,有兩種定義方式,一種是將根節(jié)點(diǎn)的深度定義為0,另一種是將根節(jié)點(diǎn)的深度定義為1。但不管怎樣,每個(gè)深度為 k 的節(jié)點(diǎn)的子節(jié)點(diǎn)的深度都為 k+1 ,這是不變的。

10. 節(jié)點(diǎn)的度:一個(gè)節(jié)點(diǎn)含有的子樹(或子節(jié)點(diǎn))的個(gè)數(shù)稱為該節(jié)點(diǎn)的度。如下圖中, 根節(jié)點(diǎn) A 的度為2,節(jié)點(diǎn) C 的度為4,節(jié)點(diǎn) I 的度為1,節(jié)點(diǎn) O 的度為 0 。

11. 樹的度:一棵樹中,最大的節(jié)點(diǎn)度稱為樹的度。如下圖中,最大的節(jié)點(diǎn)度是4,則樹的度為4。

12. 葉節(jié)點(diǎn):又稱為終端節(jié)點(diǎn),度為零的節(jié)點(diǎn)被稱為葉節(jié)點(diǎn)。如下圖中,節(jié)點(diǎn) F,H,J,K,L,M,N,O 都是葉節(jié)點(diǎn)。

13. 森林:由m(m>=0)棵互不相交的樹構(gòu)成的集合稱為森林。森林是從樹延伸出來的術(shù)語,森林里的樹一定是互不相交的。

三、樹的特點(diǎn)

通過對(duì)樹的定義和樹的術(shù)語進(jìn)行介紹,基本可以理解樹這種數(shù)據(jù)結(jié)構(gòu)了,總結(jié)起來,樹有以下特點(diǎn)。

1. 如果樹的節(jié)點(diǎn)數(shù) n>0,根節(jié)點(diǎn)是唯一的,不可能存在多個(gè)根節(jié)點(diǎn)。

2. 沒有父節(jié)點(diǎn)的節(jié)點(diǎn)稱為根節(jié)點(diǎn)。根節(jié)點(diǎn)是沒有父節(jié)點(diǎn)的。

3. 每一個(gè)非根節(jié)點(diǎn)有且只有一個(gè)父節(jié)點(diǎn)。除了根節(jié)點(diǎn)外,其他所有節(jié)點(diǎn)都有父節(jié)點(diǎn),并且同一個(gè)節(jié)點(diǎn)只有一個(gè)父節(jié)點(diǎn),不可能有多個(gè)。

4. 每個(gè)節(jié)點(diǎn)有零個(gè)或多個(gè)子節(jié)點(diǎn)。

5. 除了根節(jié)點(diǎn)外,子節(jié)點(diǎn)可以分為多個(gè)不相交的子樹。這些子樹一定是互不相交的。

6. 每個(gè)深度為 k 的節(jié)點(diǎn)的子節(jié)點(diǎn)的深度都為 k+1 。

四、樹的分類

所有樹都滿足以上的特點(diǎn),除此之外,一些樹還具有專有的特點(diǎn)。根據(jù)專有的特點(diǎn),可以對(duì)樹進(jìn)行分類。

1. 無序樹:也稱為自由樹,樹中存在一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)的子節(jié)點(diǎn)之間沒有順序關(guān)系。如下圖中,右邊的樹是無序樹,從樹中取一個(gè)節(jié)點(diǎn) D ,D 的子節(jié)點(diǎn)是節(jié)點(diǎn) J 和節(jié)點(diǎn) E,它們是沒有順序關(guān)系的,所以這是一棵無序樹。

2. 有序樹:樹中任意節(jié)點(diǎn)的子節(jié)點(diǎn)之間有順序關(guān)系。如下圖中,左邊的樹是有序樹,從樹中任意取一個(gè)節(jié)點(diǎn) C,C 的子節(jié)點(diǎn)是 F,G,H ,它們是有順序關(guān)系的(字母順序),所以這是一棵有序樹。

圖中的有序和無序以字母順序作為案例,實(shí)際應(yīng)用中的“有序”并不限于字母順序、數(shù)字順序等,實(shí)際的有序主要是指“不能互換”。

無序樹的節(jié)點(diǎn)之間沒有順序關(guān)系,節(jié)點(diǎn)之間的關(guān)系不能通過代碼來模擬和控制,所以基本沒有實(shí)際的應(yīng)用場(chǎng)景。

使用樹這種數(shù)據(jù)結(jié)構(gòu),基本都是使用有序樹,對(duì)于有序樹,又可以分為以下幾種。

1. 二叉樹:每個(gè)節(jié)點(diǎn)最多含有兩個(gè)子樹的樹稱為二叉樹,如下圖。二叉樹是最常用的樹結(jié)構(gòu),可以對(duì)二叉樹進(jìn)一步細(xì)分(另外的文章再仔細(xì)研究)。

2. 霍夫曼樹:又稱為最優(yōu)二叉樹,是一種帶權(quán)路徑最短的二叉樹。

3. B樹:是一種對(duì)讀寫操作進(jìn)行優(yōu)化的自平衡的二叉查找樹,能夠保持?jǐn)?shù)據(jù)有序,擁有多余兩個(gè)子樹。

可以看到,后面的兩種樹都是在二叉樹的基礎(chǔ)上,根據(jù)特殊的場(chǎng)景獨(dú)立出來的,光看定義很難理解,所以以后的文章再研究。

到此這篇關(guān)于數(shù)據(jù)結(jié)構(gòu)之樹的概念詳解的文章就介紹到這了,更多相關(guān)數(shù)據(jù)結(jié)構(gòu)之樹的概念內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python列表刪除和多重循環(huán)退出原理詳解

    python列表刪除和多重循環(huán)退出原理詳解

    這篇文章主要介紹了python列表刪除和多重循環(huán)退出原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python的time模塊中的常用方法整理

    Python的time模塊中的常用方法整理

    這篇文章主要介紹了Python的time模塊中的常用方法整理,time模塊是專門用于處理日期時(shí)間的模塊,需要的朋友可以參考下
    2015-06-06
  • jupyter notebook 恢復(fù)誤刪單元格或者歷史代碼的實(shí)現(xiàn)

    jupyter notebook 恢復(fù)誤刪單元格或者歷史代碼的實(shí)現(xiàn)

    這篇文章主要介紹了jupyter notebook 恢復(fù)誤刪單元格或者歷史代碼的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04
  • python安裝教程

    python安裝教程

    這篇文章主要為大家詳細(xì)介紹了python安裝教程,文中安裝步驟介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • python中的字典使用分享

    python中的字典使用分享

    Python 中的字典是Python中一個(gè)鍵值映射的數(shù)據(jù)結(jié)構(gòu),下面介紹一下如何操作字典,希望大家能夠喜歡
    2016-07-07
  • Python筆試面試題小結(jié)

    Python筆試面試題小結(jié)

    這篇文章主要介紹了Python筆試面試題的一些相關(guān)代碼,需要的朋友可以參考下
    2019-09-09
  • Python 并行化執(zhí)行詳細(xì)解析

    Python 并行化執(zhí)行詳細(xì)解析

    這篇文章主要介紹了Python 并行化執(zhí)行詳細(xì)解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-07-07
  • 詳解如何優(yōu)雅的用PyQt訪問http

    詳解如何優(yōu)雅的用PyQt訪問http

    這篇文章主要我打開詳細(xì)介紹了如何優(yōu)雅的用PyQt實(shí)現(xiàn)訪問http,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以了解下
    2024-11-11
  • Python中使用conda?install還是pip?install好

    Python中使用conda?install還是pip?install好

    這篇文章主要給大家介紹了關(guān)于Python中使用conda?install還是pip?install好的相關(guān)資料,conda install 和 pip install 都是Python的包管理工具,文中介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • python實(shí)現(xiàn)人工蜂群算法

    python實(shí)現(xiàn)人工蜂群算法

    這篇文章主要介紹了python如何實(shí)現(xiàn)人工蜂群算法,幫助大家更好的利用python進(jìn)行數(shù)據(jù)分析,感興趣的朋友可以了解下
    2020-09-09

最新評(píng)論

大同县| 靖州| 文成县| 积石山| 翁牛特旗| 定州市| 平南县| 天津市| 祁门县| 岑溪市| 桑日县| 聂荣县| 镇坪县| 吴江市| 含山县| 吉木乃县| 盐山县| 鄂伦春自治旗| 紫阳县| 天等县| 济南市| 涞源县| 康乐县| 泸州市| 汤原县| 衡水市| 双流县| 怀远县| 清徐县| 米林县| 浙江省| 达孜县| 清徐县| 舒城县| 成武县| 曲水县| 渭源县| 建瓯市| 阳信县| 阿拉尔市| 嫩江县|