基礎(chǔ)篇(四)——樹

樹是n(n>=0)個(gè)結(jié)點(diǎn)的有限集。n=0時(shí)稱為空樹。在任意一顆非空樹中:

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


一、樹的定義

樹是n(n>=0)個(gè)結(jié)點(diǎn)的有限集。n=0時(shí)稱為空樹。在任意一顆非空樹中:
(1)有且僅有一個(gè)特定的稱為根的結(jié)點(diǎn);
(2)當(dāng)n>1時(shí),其余結(jié)點(diǎn)可分為m(m>0)個(gè)互不相交的有限集T1、T2、......、Tm,其中每一個(gè)集合本身又是一棵樹,并且稱為根的子樹。
如圖所示:


關(guān)于樹:

(1)n>0時(shí)根結(jié)點(diǎn)是唯一的,不可能存在多個(gè)根結(jié)點(diǎn)。
(2)m>0時(shí),子樹的個(gè)數(shù)沒有限制,但是它們一定是互不相交的,下圖所示的就不符合數(shù)的定義,因?yàn)樗鼈兌加邢嘟坏淖訕洹?/p>

二、樹的存儲(chǔ)結(jié)構(gòu)

1.雙親表示法

在每個(gè)結(jié)點(diǎn)中,附設(shè)一個(gè)指示器指示其雙親結(jié)點(diǎn)在數(shù)組中的位置。也就是說,每個(gè)結(jié)點(diǎn)除了知道自己是誰(shuí)以外,還知道它的雙親結(jié)點(diǎn)在數(shù)組中的位置。



其中data是數(shù)據(jù)域,存儲(chǔ)結(jié)點(diǎn)的數(shù)據(jù)信息。而parent是指針域,存儲(chǔ)該結(jié)點(diǎn)的雙親在數(shù)組中的下標(biāo)。

這樣的存儲(chǔ)結(jié)構(gòu),我們可以根據(jù)結(jié)點(diǎn)的parent指針很容易找到它的雙親結(jié)點(diǎn),所以用的時(shí)間復(fù)雜度為O(1),知道parent為-1時(shí),表示找到了樹結(jié)點(diǎn)的根??墒侨绻澜Y(jié)點(diǎn)的孩子是什么,得遍歷整個(gè)結(jié)構(gòu)才行。

改進(jìn):

增加一個(gè)結(jié)點(diǎn)最左邊孩子的域,叫它長(zhǎng)子域,這樣就可以很容易得到結(jié)點(diǎn)的孩子。如果沒有孩子的結(jié)點(diǎn),這個(gè)長(zhǎng)子域就設(shè)置為-1,如圖所示:


對(duì)于有0個(gè)或1個(gè)孩子結(jié)點(diǎn)來說,這樣就解決了找結(jié)點(diǎn)孩子的問題了。甚至是兩個(gè)孩子,知道了長(zhǎng)子是誰(shuí),另一個(gè)當(dāng)然就是次子了。

再改進(jìn):

可以增加一個(gè)右兄弟域來體現(xiàn)兄弟關(guān)系,也就是說,每個(gè)結(jié)點(diǎn)如果它存在右兄弟,則記錄下右兄弟的下標(biāo)。同樣的,如果右兄弟不存在,則賦值為-1,如下圖所示:

總結(jié):

存儲(chǔ)結(jié)構(gòu)的設(shè)計(jì)是一個(gè)非常靈活的過程。一個(gè)存儲(chǔ)結(jié)構(gòu)設(shè)計(jì)得是否合理,取決于基于該存儲(chǔ)結(jié)構(gòu)的運(yùn)算是否合適、是否方便,時(shí)間復(fù)雜度好不好等。注意也不是越多越好,有需要時(shí)再設(shè)計(jì)相應(yīng)的結(jié)構(gòu)。

2.孩子表示法

把每個(gè)結(jié)點(diǎn)的孩子結(jié)點(diǎn)排列起來,以單鏈表作存儲(chǔ)結(jié)構(gòu),則n個(gè)結(jié)點(diǎn)有n個(gè)孩子鏈表,如果是葉子結(jié)點(diǎn)則此單鏈表為空。然后n個(gè)頭指針又組成一個(gè)線性表,采用順序存儲(chǔ)結(jié)構(gòu),存放進(jìn)一個(gè)一維數(shù)組中,如下圖所示:

3.孩子兄弟表示法

任意一棵樹,它的結(jié)點(diǎn)的第一個(gè)孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們?cè)O(shè)置兩個(gè)指針,分別指向該結(jié)點(diǎn)的第一個(gè)孩子和此結(jié)點(diǎn)的右兄弟。

三、二叉樹的定義

二叉樹是n(n>=0)個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集(稱為空二叉樹),或者由一個(gè)根結(jié)點(diǎn)和兩顆互不相交的、分別稱為根結(jié)點(diǎn)的左子樹和右子樹的二叉樹組成。

二叉樹特點(diǎn):

(1)每個(gè)結(jié)點(diǎn)最多有兩棵子樹,所以二叉樹中不存在度大于2的結(jié)點(diǎn)。注意不是只有兩棵子樹,而是最多有。沒有子樹或者有一棵子樹都是可以的。
(2)左子樹和右子樹是有順序的,次序不能任意顛倒。
(3)即使樹中某結(jié)點(diǎn)只有一棵子樹,也要區(qū)別它是左子樹還是右子樹。

二叉樹具有五種基本形態(tài):

(1)空二叉樹。
(2)只有一個(gè)根結(jié)點(diǎn)。
(3)根結(jié)點(diǎn)只有右子樹。
(4)根結(jié)點(diǎn)既有左子樹又有右子樹。

特殊二叉樹:
1.斜樹

所有的結(jié)點(diǎn)都只有左子樹的二叉樹叫左斜樹。所有結(jié)點(diǎn)都是只有右子樹的二叉樹叫右斜樹。這兩者統(tǒng)稱為斜樹。斜樹有很明顯的特點(diǎn),就是每一層都只有一個(gè)結(jié)點(diǎn),結(jié)點(diǎn)的個(gè)數(shù)與二叉樹的深度相同。

2.滿二叉樹

在一棵二叉樹中,如果所有分支結(jié)點(diǎn)都存在左子樹和右子樹,并且所有葉子都在同一層上,這樣的二叉樹稱為滿二叉樹。
滿二叉樹的特點(diǎn):
(1)葉子只能出現(xiàn)在最下一層。出現(xiàn)在其它層就不可能達(dá)成平衡。
(2)非葉子結(jié)點(diǎn)的度一定是2。
(3)在同樣深度的二叉樹中,滿二叉樹的結(jié)點(diǎn)個(gè)數(shù)最多,葉子數(shù)最多。

3.完全二叉樹

對(duì)一個(gè)具有n個(gè)結(jié)點(diǎn)的二叉樹按層序編號(hào),如果編號(hào)為i(1<=i<=n)的結(jié)點(diǎn)與同樣深度的滿二叉樹中編號(hào)為i的結(jié)點(diǎn)在二叉樹中位置完全相同,則這棵二叉樹稱為完全二叉樹。
完全二叉樹的特點(diǎn):
(1)葉子結(jié)點(diǎn)只能出現(xiàn)在最下兩層。
(2)最下層的葉子一定集中在左部連續(xù)位置。
(3)倒數(shù)兩層,若有葉子結(jié)點(diǎn),一定都在右部連續(xù)位置。
(4)如果結(jié)點(diǎn)度為1,則該結(jié)點(diǎn)只有左孩子,即不存在只有右子樹的情況。
(5)同樣結(jié)點(diǎn)數(shù)的二叉樹,完全二叉樹的深度最小。

滿二叉樹一定是一棵完全二叉樹,但完全二叉樹不一定是滿的。

四、二叉樹的存儲(chǔ)結(jié)構(gòu)

二叉樹的順序存儲(chǔ)結(jié)構(gòu)

二叉樹的順序存儲(chǔ)結(jié)構(gòu)就是用一維數(shù)組存儲(chǔ)二叉樹中的結(jié)點(diǎn),并且結(jié)點(diǎn)的存儲(chǔ)位置,也就是數(shù)組的下標(biāo)要能體現(xiàn)結(jié)點(diǎn)之間的邏輯關(guān)系,不如雙親與孩子的關(guān)系,左右兄弟的關(guān)系等。
滿二叉樹的順序存儲(chǔ):


將這棵二叉樹存入到數(shù)組中,相應(yīng)的下標(biāo)對(duì)應(yīng)其同樣的位置,如圖所示:


二叉鏈表

二叉樹每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子,所以為它設(shè)計(jì)一個(gè)數(shù)據(jù)域和兩個(gè)指針域。稱這樣的鏈表叫做二叉鏈表。



其中,data是數(shù)據(jù)域,lchild和rchild都是指針域,分別存放指向左孩子和右孩子的指針。如果有需要,還可以再增加一個(gè)指向其雙親的指針域,那樣就稱之為三叉鏈表。

五、遍歷二叉樹

二叉樹的遍歷是指從根結(jié)點(diǎn)出發(fā),按照某種次序依次訪問二叉樹中所有結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)被訪問一次且僅被訪問一次。

1.前序遍歷

規(guī)則是若二叉樹為空,則空操作返回,否則先訪問根結(jié)點(diǎn),然后前序遍歷左子樹,再前序遍歷右子樹。遍歷的順序?yàn)椋篈BDGHCEIF。

2.中序遍歷

規(guī)則是若樹為空,則空操作返回,否則從根結(jié)點(diǎn)開始(注意并不是先訪問根結(jié)點(diǎn)),中序遍歷根結(jié)點(diǎn)的左子樹,然后是訪問根結(jié)點(diǎn),最后中序遍歷右子樹。遍歷的順序?yàn)椋篏DHBAEICF。

3.后序遍歷

規(guī)則是若樹為空,則空操作返回,否則從左到右先葉子后結(jié)點(diǎn)的方式遍歷訪問左右子樹,最后是訪問根結(jié)點(diǎn)。遍歷的順序?yàn)椋篏HDBIEFCA。


4.層序遍歷

規(guī)則是若樹為空,則空操作返回,否則從樹的第一層,也就是根結(jié)點(diǎn)開始訪問,從上而下逐層遍歷,在同一層中,按從左到右的順序?qū)Y(jié)點(diǎn)逐個(gè)訪問。遍歷的順序?yàn)椋篈BCDEFGHIJ。


學(xué)習(xí)是一個(gè)慢慢積累的過程,也是一件很快樂的事,這種快樂來自于你的思考。完成一項(xiàng)學(xué)習(xí)任務(wù)固然重要,但更重要的是在完成的過程中學(xué)到了什么,掌握了什么,遇到一些什么問題,為什么會(huì)出現(xiàn)這種問題,根源是什么,都有哪些解決方案,什么樣的情況適合這個(gè)方案。只有在不斷的思考,你的能力才會(huì)有所提升!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,692評(píng)論 0 25
  • 四、樹與二叉樹 1. 二叉樹的順序存儲(chǔ)結(jié)構(gòu) 二叉樹的順序存儲(chǔ)就是用數(shù)組存儲(chǔ)二叉樹。二叉樹的每個(gè)結(jié)點(diǎn)在順序存儲(chǔ)中都有...
    MinoyJet閱讀 1,744評(píng)論 0 7
  • 1.樹(Tree): 樹是 n(n>=0) 個(gè)結(jié)點(diǎn)的有限集。當(dāng) n=0 時(shí)稱為空樹。在任意一顆非空樹中:有且僅有一...
    ql2012jz閱讀 1,195評(píng)論 0 3
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 6,006評(píng)論 0 19
  • 前面講到的順序表、棧和隊(duì)列都是一對(duì)一的線性結(jié)構(gòu),這節(jié)講一對(duì)多的線性結(jié)構(gòu)——樹。「一對(duì)多」就是指一個(gè)元素只能有一個(gè)前...
    Alent閱讀 2,391評(píng)論 1 28

友情鏈接更多精彩內(nèi)容