亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

Python數(shù)據(jù)結(jié)構(gòu)——樹的基本概念

wapeyang / 1588人閱讀

摘要:圖是構(gòu)成網(wǎng)頁(yè)的超文本標(biāo)記語(yǔ)言中的標(biāo)簽相互關(guān)聯(lián)關(guān)系所構(gòu)成的樹。節(jié)點(diǎn)節(jié)點(diǎn)是樹的基本構(gòu)成部分。子樹子樹是一個(gè)父節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)的所有邊和后代節(jié)點(diǎn)所構(gòu)成的集合。高度樹的高度等于所有節(jié)點(diǎn)的層數(shù)的最大值。每個(gè)子樹的根節(jié)點(diǎn)和其父樹的根節(jié)點(diǎn)之間通過(guò)邊相連。

樹的例子

我們已經(jīng)學(xué)過(guò)了像棧和隊(duì)列這樣的線性數(shù)據(jù)結(jié)構(gòu),同時(shí)我們對(duì)遞歸也有了一定的了解,現(xiàn)在讓我們來(lái)看看另一種常見的數(shù)據(jù)結(jié)構(gòu)——樹(Tree)。樹在計(jì)算機(jī)科學(xué)里應(yīng)用廣泛,包括操作系統(tǒng),圖形學(xué),數(shù)據(jù)庫(kù)和計(jì)算機(jī)網(wǎng)絡(luò)。樹和真正的樹有許多相似的地方,也包括根、樹枝和葉子,它們的不同在于計(jì)算機(jī)中的樹的根在頂層而它的葉子在底部。

在我們開始學(xué)習(xí)樹之前,讓我們先來(lái)看看幾個(gè)常見的關(guān)于樹的例子。首先讓我們看看生物學(xué)中的分類。圖 1 是一個(gè)動(dòng)物分類的例子,從中我們可以看出樹的幾個(gè)特點(diǎn)。第一,這個(gè)例子說(shuō)明樹是分級(jí)的,這里分級(jí)的意思是樹的頂層部分更加寬泛,而底部更加具體。在這個(gè)例子中,最上層的是“界”,它下面的一層(上層的子級(jí))是“門”,然后是“綱”等等。但是,無(wú)論我們細(xì)分到多少層,這里面包含的生命體也都是動(dòng)物。

圖 1:一些動(dòng)物的分類樹

我們注意到可以從樹的頂層開始然后沿著圓圈和箭頭構(gòu)成的一條路徑到達(dá)樹的底層。在樹的每一層我們都可以問(wèn)自己一個(gè)問(wèn)題,然后沿著相符的那條路徑繼續(xù)下去。比如我們可以問(wèn) “這個(gè)動(dòng)物是脊椎動(dòng)物還是無(wú)脊椎動(dòng)物”,如果回答是“脊椎動(dòng)物”我們就沿著脊椎動(dòng)物這條路下去然后接著問(wèn)“這個(gè)脊椎動(dòng)物是哺乳動(dòng)物嗎”,如果回答“不是哺乳動(dòng)物”我們就卡在這里了(不過(guò)僅限于這個(gè)簡(jiǎn)單的例子會(huì)有這種情況)。當(dāng)我們到達(dá)哺乳動(dòng)物這一層的時(shí)候我們問(wèn)自己“這個(gè)哺乳動(dòng)物是靈長(zhǎng)類還是食肉動(dòng)物”。我們可以沿著路徑一直走下去直到樹的最底層,這也就能看到動(dòng)物的名稱了。

樹的第二個(gè)特點(diǎn)是一個(gè)節(jié)點(diǎn)(node)的所有子節(jié)點(diǎn)(children)和另一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)是完全獨(dú)立的。比如“貓屬”有兩個(gè)子節(jié)點(diǎn)“家生”和“野生”,“蠅屬”中也有一個(gè)“家生”,但它和“貓屬”中的“家生”完全不同而且相互獨(dú)立。這意味著我們可以在不影響“貓屬” 的子節(jié)點(diǎn)的情況下更改“蠅屬”的子節(jié)點(diǎn)。

樹的第三個(gè)特點(diǎn)就是每個(gè)它的葉節(jié)點(diǎn)(leaf)都是不同的。對(duì)每一種動(dòng)物,我們都可以從根節(jié)點(diǎn)(root)開始沿著一條特定的路徑找到它對(duì)應(yīng)的葉節(jié)點(diǎn),并把它和其他動(dòng)物區(qū)分開,例如對(duì)于家貓,我們可以沿著動(dòng)物界——脊索動(dòng)物門——哺乳動(dòng)物綱——食肉動(dòng)物目——貓科——貓屬——家貓找到它。

另一個(gè)樹的例子就是你每天都會(huì)用到的文件系統(tǒng)。在文件系統(tǒng)中,磁盤的分支或者說(shuō)子目錄都是運(yùn)用了樹來(lái)構(gòu)建的。圖 2 展示了Unix文件系統(tǒng)的部分的分層情況。

圖 2 :Unix文件系統(tǒng)的部分的分層情況

這個(gè)樹的文件系統(tǒng)和真正的樹也非常相像。你可以從根節(jié)點(diǎn)出發(fā)沿著一條路徑到任意分支。這條路徑會(huì)把這個(gè)子分支(包括它里面的所有文件)和其他分支區(qū)別開。樹的另一重要特點(diǎn),就是你可以將樹下層的所有部分(叫做子樹subtree)移動(dòng)到樹的另一位置而不影響更下層的情況,這是由樹的分級(jí)方式?jīng)Q定的。例如,我們可以將所有標(biāo)注/etc的子樹從根節(jié)點(diǎn)下移動(dòng)到usr/下面。這樣做會(huì)將 httpd 的路徑從/etc/httpd改變成/usr/etc/httpd,但是對(duì)httpd的內(nèi)容和子節(jié)點(diǎn)的內(nèi)容不會(huì)有影響。

最后一個(gè)樹的例子是一個(gè)網(wǎng)頁(yè)。下圖是一個(gè)利用超文本標(biāo)記語(yǔ)言(HTML)編寫的簡(jiǎn)單網(wǎng)頁(yè)。圖 3 是構(gòu)成網(wǎng)頁(yè)的超文本標(biāo)記語(yǔ)言中的標(biāo)簽相互關(guān)聯(lián)關(guān)系所構(gòu)成的樹。


    
        
        simple
    
    
        

A simple web page

  • List item one
  • List item two

Luther CS

圖 3 :網(wǎng)頁(yè)的標(biāo)記符之間的相互關(guān)聯(lián)所構(gòu)成的樹

上面的超文本標(biāo)記的代碼和它對(duì)應(yīng)的樹說(shuō)明了另一種分級(jí)方式。我們發(fā)現(xiàn)樹的每一層都對(duì)應(yīng)超文本標(biāo)記符的一層嵌套。代碼的第一個(gè)標(biāo)記符是同時(shí)最后一個(gè)是。這一頁(yè)中所有其他的標(biāo)記符也都是成對(duì)的。試一下你就會(huì)發(fā)現(xiàn)這種嵌套的特點(diǎn)在樹的每一層都是成立的。

術(shù)語(yǔ)表與定義

現(xiàn)在我們已經(jīng)看了幾個(gè)樹的例子了,現(xiàn)在正式定義樹以及構(gòu)成它的要素。

節(jié)點(diǎn)(Node
節(jié)點(diǎn)是樹的基本構(gòu)成部分。它可能有其他專屬的名稱,我們稱之為“鍵(key)”。一個(gè)節(jié)點(diǎn)也可能有更多的信息,我們稱之為“負(fù)載”。雖然負(fù)載信息和樹的許多算法并不直接相關(guān),但是它對(duì)于樹的應(yīng)用至關(guān)重要。

邊(Edge
邊也是樹的基本構(gòu)成部分。邊連接兩個(gè)節(jié)點(diǎn),并表示它們之間存在聯(lián)系。除了根節(jié)點(diǎn)外每個(gè)節(jié)點(diǎn)都有且只有一條與其他節(jié)點(diǎn)相連的入邊(指向該節(jié)點(diǎn)的邊),每個(gè)節(jié)點(diǎn)可能有許多條出邊(從該節(jié)點(diǎn)指向其他節(jié)點(diǎn)的邊)。

根節(jié)點(diǎn)(Root
根節(jié)點(diǎn)是樹種中唯一一個(gè)沒(méi)有入邊的節(jié)點(diǎn)。在圖 2 中,“/”是樹的根節(jié)點(diǎn)。

路徑(Path
路徑是由邊連接起來(lái)的節(jié)點(diǎn)的有序排列。例如:(動(dòng)物界——脊索動(dòng)物門——哺乳動(dòng)物綱——食肉動(dòng)物目——貓科——貓屬——家貓)就是一條路徑。

子節(jié)點(diǎn)集(Children
當(dāng)一個(gè)節(jié)點(diǎn)的入邊來(lái)自另一個(gè)節(jié)點(diǎn)時(shí),我們稱前者是后者的子節(jié)點(diǎn),同一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)構(gòu)成子節(jié)點(diǎn)集。在圖 2 中,節(jié)點(diǎn)log/,spool/,yp/構(gòu)成節(jié)點(diǎn)var/的子節(jié)點(diǎn)集。

父節(jié)點(diǎn)(Parent
一個(gè)節(jié)點(diǎn)是它出邊所連接的所有節(jié)點(diǎn)的父節(jié)點(diǎn)。在圖 2 中,節(jié)點(diǎn)var/是節(jié)點(diǎn)log/,spool/,yp/的父節(jié)點(diǎn)。

兄弟節(jié)點(diǎn)(Sibling
同一個(gè)節(jié)點(diǎn)的所有子節(jié)點(diǎn)互為兄弟節(jié)點(diǎn),在文件系統(tǒng)樹中節(jié)點(diǎn)etc/和節(jié)點(diǎn)usr/是兄弟節(jié)點(diǎn)。

子樹(Subtree
子樹是一個(gè)父節(jié)點(diǎn)的某個(gè)子節(jié)點(diǎn)的所有邊和后代節(jié)點(diǎn)所構(gòu)成的集合。

葉節(jié)點(diǎn)(Leaf Node
沒(méi)有子節(jié)點(diǎn)的節(jié)點(diǎn)成為稱為葉節(jié)點(diǎn)。例如圖 1 中的“人”和“黑猩猩”就是葉節(jié)點(diǎn)。

層數(shù)(Level
一個(gè)節(jié)點(diǎn)的層數(shù)是指從根節(jié)點(diǎn)到該節(jié)點(diǎn)的路徑中的邊的數(shù)目。例如,圖 1 中“貓屬”的層數(shù)是 5,定義根節(jié)點(diǎn)的層數(shù)為 0。

高度(Height
樹的高度等于所有節(jié)點(diǎn)的層數(shù)的最大值。圖 2 中樹的高度為 2。

我們已經(jīng)定義好所需的術(shù)語(yǔ)了,現(xiàn)在可以正式定義樹了。我們將用兩種方式定義,一種需要用到節(jié)點(diǎn)和邊,而另一種更為有效的定義方式是利用遞歸定義。

定義一:樹是節(jié)點(diǎn)和連接節(jié)點(diǎn)的邊的集合,它有以下特征:

有一個(gè)節(jié)點(diǎn)被設(shè)計(jì)為根節(jié)點(diǎn)。

除了根節(jié)點(diǎn)的每一個(gè)節(jié)點(diǎn) n,都通過(guò)一條邊與它唯一的父節(jié)點(diǎn)相連。

可以沿著唯一的路徑從根節(jié)點(diǎn)到每個(gè)節(jié)點(diǎn)。

如果這個(gè)樹的每個(gè)節(jié)點(diǎn)都至多有兩個(gè)子節(jié)點(diǎn),我們稱它為二叉樹。

圖 4 展示了一個(gè)符合定義一的樹。每條邊的箭頭指出了連接的方向。

圖 4 :由節(jié)點(diǎn)和邊構(gòu)成的樹

定義二:每個(gè)樹或者為空,或者包含一個(gè)根節(jié)點(diǎn)和 0 個(gè)或多個(gè)子樹,其中每個(gè)子樹也符合這樣的定義。每個(gè)子樹的根節(jié)點(diǎn)和其父樹的根節(jié)點(diǎn)之間通過(guò)邊相連。圖 5 描繪了這種遞歸定義的樹。通過(guò)這種樹的遞歸定義,我們知道圖 5 中的樹至少有 4 個(gè)節(jié)點(diǎn),因?yàn)槊總€(gè)三角形所代表的子樹必須有根。它也可能有更多的節(jié)點(diǎn),但我們需要更深入的了解這棵樹來(lái)得到答案。

圖 5 :遞歸法定義的樹

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/44183.html

相關(guān)文章

  • Python數(shù)據(jù)結(jié)構(gòu)——AVL樹的基本概念

    摘要:我們知道,當(dāng)樹變得不平衡時(shí)和操作會(huì)使二叉搜索樹的性能降低到。樹實(shí)現(xiàn)抽象數(shù)據(jù)類型就像一個(gè)普通的二叉搜索樹,唯一不同的是這棵樹的工作方式。我們通過(guò)比較每個(gè)節(jié)點(diǎn)的左右子樹的高度完成比較。 平衡二叉搜索樹 在上一節(jié)中我們討論了建立一個(gè)二叉搜索樹。我們知道,當(dāng)樹變得不平衡時(shí)get和put操作會(huì)使二叉搜索樹的性能降低到O(n)。在這一節(jié)中我們將看到一種特殊的二叉搜索樹,它可以自動(dòng)進(jìn)行調(diào)整,以確保樹...

    jiekechoo 評(píng)論0 收藏0
  • Python數(shù)據(jù)結(jié)構(gòu)——AVL樹的實(shí)現(xiàn)

    摘要:一旦子樹平衡因子為零,那么父節(jié)點(diǎn)的平衡因子不會(huì)發(fā)生改變。新根的父節(jié)點(diǎn)將成為舊根的父節(jié)點(diǎn)。因?yàn)槠渌僮鞫际且苿?dòng)整個(gè)子樹,被移動(dòng)的子樹內(nèi)的節(jié)點(diǎn)的平衡因子不受旋轉(zhuǎn)的影響。讓表示以為根節(jié)點(diǎn)的子樹的高度。 既然,我們已經(jīng)證明,保持 AVL 樹的平衡將會(huì)使性能得到很大的提升,那我們看看如何在程序中向樹插入一個(gè)新的鍵值。因?yàn)樗械男骆I是作為葉節(jié)點(diǎn)插入樹的,而新葉子的平衡因子為零,所以我們對(duì)新插入的節(jié)...

    Pink 評(píng)論0 收藏0
  • Python數(shù)據(jù)結(jié)構(gòu)

    摘要:堆棧和隊(duì)列稱為線性數(shù)據(jù)結(jié)構(gòu),而圖形和樹是非線性數(shù)據(jù)結(jié)構(gòu)。在單次運(yùn)行期間,可能無(wú)法遍歷非線性數(shù)據(jù)結(jié)構(gòu)中的所有數(shù)據(jù)項(xiàng)。堆棧是根據(jù)概念插入和移除的對(duì)象的容器。將元素添加到堆棧時(shí),它被稱為推送操作,而當(dāng)您刪除或刪除元素時(shí),它被稱為彈出操作。 概述 ????數(shù)據(jù)結(jié)構(gòu)是組織數(shù)據(jù)的方式,以便能夠更好的存儲(chǔ)和獲取數(shù)據(jù)。數(shù)據(jù)結(jié)構(gòu)定義數(shù)據(jù)之間的關(guān)系和對(duì)這些數(shù)據(jù)的操作方式。數(shù)據(jù)結(jié)構(gòu)屏蔽了數(shù)據(jù)存儲(chǔ)和操作的細(xì)節(jié)...

    fantix 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<