Java集合源碼分析之基礎(chǔ)(三):樹與二叉樹

數(shù)組和鏈表都是用來解決一對(duì)一問題的,而一對(duì)多問題則需要樹來解決。這里,我們重點(diǎn)關(guān)注二叉排序樹,所以只會(huì)介紹一些必需了解的概念,關(guān)于樹的更多知識(shí),大家可以查看相關(guān)書籍進(jìn)行系統(tǒng)的學(xué)習(xí)。

樹的定義

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

下圖就是一棵樹:


樹示意圖

與現(xiàn)實(shí)中的樹不同,數(shù)據(jù)結(jié)構(gòu)里的樹的根在最上方,并且只有一個(gè)根,就像一棵倒置的樹。樹的每個(gè)結(jié)點(diǎn)往下都是一棵子樹,且這些子樹不能相交,如下所示就不是一棵正確的樹:


樹的錯(cuò)誤示例

相關(guān)概念

結(jié)點(diǎn)分類

樹的結(jié)點(diǎn)包含一個(gè)數(shù)據(jù)元素及若干指向其子樹的分支。結(jié)點(diǎn)擁有的子樹數(shù)稱為結(jié)點(diǎn)的度(Degree) 。度為0的結(jié)點(diǎn)稱為葉結(jié)點(diǎn)(Leaf)終端結(jié)點(diǎn);度不為0 的結(jié)點(diǎn)稱為非終端結(jié)點(diǎn)分支結(jié)點(diǎn)。除根結(jié)點(diǎn)之外,分支結(jié)點(diǎn)也稱為內(nèi)部結(jié)點(diǎn)。樹的度是樹內(nèi)各結(jié)點(diǎn)的度的最大值。

如下圖所示,A結(jié)點(diǎn)為根節(jié)點(diǎn),G、H、I、J、F為葉節(jié)點(diǎn),其余節(jié)點(diǎn)則為內(nèi)部節(jié)點(diǎn),此樹的度為3。


結(jié)點(diǎn)間關(guān)系

結(jié)點(diǎn)的子樹的根稱為該結(jié)點(diǎn)的孩子(Child),相應(yīng)地,該結(jié)點(diǎn)稱為孩子的雙親(Parent)。同一個(gè)雙親的孩子之間互稱兄弟(Sibling)。結(jié)點(diǎn)的祖先是從根到該結(jié)點(diǎn)所經(jīng)分支上的所有結(jié)點(diǎn)。反之,以某結(jié)點(diǎn)為根的子樹中的任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫。

關(guān)系示意圖

深度

結(jié)點(diǎn)的層次(LeveI)從根開始定義起,根為第一層,根的孩子為第二層。若某結(jié)點(diǎn)在第L層,則其子樹的根就在第L+1 層。其雙親在同一層的結(jié)點(diǎn)互為堂兄弟。樹中結(jié)點(diǎn)的最大層次稱為樹的深度(Depth)高度

深度示意圖

有序樹,無序樹

如果將樹中結(jié)點(diǎn)的各子樹看成從左至右是有次序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹。

二叉樹

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

下圖就是一個(gè)二叉樹,二叉樹就是每個(gè)結(jié)點(diǎn)的度≤2的樹。


二叉樹示意圖

二叉樹有許多有用的性質(zhì),還有一些詳細(xì)的分類,相關(guān)知識(shí)大家可以自行查閱資料。

二叉樹遍歷

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

前序遍歷

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

如下圖所示,遍歷結(jié)果為:ABDGHCEIF。


前序遍歷

中序遍歷

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

如下圖所示,遍歷結(jié)果為:GDHBAEICF。


中序遍歷

后序遍歷

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

如下圖所示,遍歷結(jié)果為:GHDBIEFCA。


后序遍歷

上一篇:Java集合源碼分析之基礎(chǔ)(二):哈希表

下一篇:Java集合源碼分析之基礎(chǔ)(四):二叉排序樹


我是飛機(jī)醬,如果您喜歡我的文章,可以關(guān)注我~

編程之路,道阻且長(zhǎng)。唯,路漫漫其修遠(yuǎn)兮,吾將上下而求索。

最后編輯于
?著作權(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)容

  • 前言 樹是數(shù)據(jù)結(jié)構(gòu)中的重中之重,尤其以各類二叉樹為學(xué)習(xí)的難點(diǎn)。一直以來,對(duì)于樹的掌握都是模棱兩可的狀態(tài),現(xiàn)在希望通...
    MrHorse1992閱讀 355,564評(píng)論 51 536
  • 數(shù)據(jù)結(jié)構(gòu)和算法--二叉樹的實(shí)現(xiàn) 幾種二叉樹 1、二叉樹 和普通的樹相比,二叉樹有如下特點(diǎn): 每個(gè)結(jié)點(diǎn)最多只有兩棵子...
    sunhaiyu閱讀 6,695評(píng)論 0 14
  • 四、樹與二叉樹 1. 二叉樹的順序存儲(chǔ)結(jié)構(gòu) 二叉樹的順序存儲(chǔ)就是用數(shù)組存儲(chǔ)二叉樹。二叉樹的每個(gè)結(jié)點(diǎn)在順序存儲(chǔ)中都有...
    MinoyJet閱讀 1,729評(píng)論 0 7
  • 1.樹(Tree): 樹是 n(n>=0) 個(gè)結(jié)點(diǎn)的有限集。當(dāng) n=0 時(shí)稱為空樹。在任意一顆非空樹中:有且僅有一...
    ql2012jz閱讀 1,190評(píng)論 0 3
  • 樹和二叉樹 1、樹的定義 樹(Tree)是由一個(gè) 或 多個(gè)結(jié)點(diǎn) 組成的有限集合T,且滿足: ①有且僅有一個(gè)稱為根的...
    利伊奧克兒閱讀 1,560評(píng)論 0 1

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