数据结构(十八)树的定义与存储结构
一、樹的定義
1.樹(Tree)是n(n>=0)個結點的有限集。n=0時稱為空樹。在任意一棵非空樹中:(1)有且僅有一個特定的稱為根(Root)的結點;(2)當n>1時,其余結點可分為m(m>0)個互不相交的有限集T1、T2、...Tm,其中每一個集合本身又是一棵樹,并且稱為根的子樹(SubTree)。
2.結點分類:樹的結點包含一個數據元素及若干指向其子樹的分支。結點擁有的子樹數稱為結點的度(Degree)。度為0的結點稱為葉結點(Leaf)或終端結點;度不為0的結點稱為非終端結點或分支結點。除根結點之外,分支結點也稱為內部結點。樹的度是樹內各結點的度的最大值。
3.結點間關系:結點的子樹的根稱為該結點的孩子(Child),該結點稱為孩子的雙親(Parent)。同一個雙親的孩子之間互稱為兄弟(Sibling),結點的祖先是從根到該結點所經分支上的所有結點,反之,以某結點為根的子樹中任一結點都稱為該結點的子孫。
4.結點的層次(Level):從根開始定義起,根為第一層,根的孩子為第二層次。若某結點在第i層,則其子樹的根就在第i+1層。其雙親在同一層的結點互為堂兄弟。樹中結點的最大層次稱為樹的深度(Depth)或高度。
5.如果將樹中結點的各子樹看成從左到右是有次序的,不能互換的,則稱該樹為有序樹,否則稱為無序樹。森林(Forest)是m(m>=0)棵互不相交的樹的集合。對樹中每個結點而言,其子樹的集合即為森林。
二、樹的存儲結構
樹的存儲結構有四種不同的表示法:雙親表示法、孩子表示法、雙親孩子表示法、孩子兄弟表示法。
1.雙親表示法
以一組連續空間存儲樹的結點,同時在每個結點中,附設一個指示器指示其雙親結點在數組中的位置。結點結構包括data數據域和parent指針域。約定根結點的位置與設置為-1。這種存儲結構,可以根據結點的parent指針很容易找到它的雙親結點,所用的時間復雜度為O(1),直到parent為-1時,表示找到了樹結點的根。但是,要知道結點的孩子是什么,只能遍歷整個結構才行。
為了便于找到結點的孩子是什么,可以增加一個結點最左邊孩子的域firstchild,叫它長子域,這樣就很容易得到結點的孩子。如果沒有孩子的結點,這個長子域就設置為-1。對于有2個孩子來說,知道了長子,另一個當然就是次子了。
為了便于體現各兄弟之間的關系,可以增加一個右兄弟域rightsib來記錄每個結點右兄弟的下標,如果右兄弟不存在,就設置為-1。
2.孩子表示法
由于樹中每個結點可能有多棵子樹,可以考慮用多重鏈表,即每個結點有多個指針域,其中每個指針指向一棵子樹的根結點,把這種方法叫做多重鏈表表示法。由于樹的每個結點的讀,也就是它的孩子個數是不同的,所以有兩種方案來解決。
方案一:指針域的個數就等于樹的度,也就是各個結點度的最大值。適用于樹的各結點度相差很小的情況下,因為開辟的空間都被充分利用了。
方案二:每個結點指針域的個數等于該結點的度,專門取一個位置來存儲結點指針域的個數。這種方法克服了浪費空間的缺點,對空間利用了是很高了,但是由于各個結點的鏈表是不相同的結構,加上要維護結點的度的數值,在運算上就會帶來時間上的損耗。
孩子表示法既可以減少空指針的浪費又能使結點結構相同。具體辦法是,把每個結點的孩子結點排列起來,以單鏈表作為存儲結構,則n個結點有n個孩子鏈表,如果是葉子結點則次單鏈表為空。然后n個頭指針又組成一個線性表,采用順序存儲結構,存放進一個一維數組中。表頭數組的表結構包括data數據域和firstchild孩子鏈表頭指針域。孩子鏈表的孩子結點的結構包括child數據域,用來存儲某個結點在表頭數組中的下標,還有next指針域,用來存儲指向某結點的下一個孩子結點的指針。
3.雙親孩子表示法
對于孩子表示法來說,這樣的結構對于查找某個結點的某個孩子,或者找某個結點的兄弟,只需要查找這個結點的孩子單鏈表即可。對于遍歷整棵樹也是很方便的,對頭結點的數組循環即可。但是,要想知道某個結點的雙親是誰,就必須要遍歷整棵樹才行。可以把雙親表示法和孩子表示法綜合一下形成雙親孩子表示法,即在頭結點增加一個parent指針域即可。
4.孩子兄弟表示法
任意一棵樹,它的結點的第一個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,可以將結點結構設計成這樣:data數據域,firstchild指針域用來存儲該結點的第一個孩子結點的存儲地址,rightsib指針域用來存儲該結點的右兄弟結點的存儲地址。
孩子兄弟表示法,給查找某個結點的某個孩子帶來了方便,只需要通過firstchild找到次結點的長子,再通過長子結點的right找到它的二弟,接著一直下去,直到找到具體的孩子。
轉載于:https://www.cnblogs.com/BigJunOba/p/9208126.html
總結
以上是生活随笔為你收集整理的数据结构(十八)树的定义与存储结构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python——数据类型
- 下一篇: 文章添加版权标记