樹(Tree)是n(n>=0)個結點的有限集。n=0時稱爲空樹。在任意一顆非空樹中:(1)有且僅有一個特定的稱爲根(Root)的結點;(2)當n>1時,其他結點可分爲m(m>0)個互不相交的有限集T一、T二、........、Tm,其中每個集合自己又是一棵樹,而且稱爲根的子樹(SubTree),如圖6-2-1所示數組
結點分類:
樹的結點包含一個數據元素及若干指向其子樹的分支。結點擁有的子樹數稱爲結點的度(Degree)。度爲0的結點稱爲葉結點(Leaf)或終端結點;度不爲0的結點稱爲非終端結點或分支結點。除根結點以外,分支結點也稱爲內部結點。樹的度是樹內各結點的度的最大值。如圖6-2-4所示,由於這棵樹結點的度的最大值是結點D的度,爲3,因此樹的度也爲3。
結點的子樹的根稱爲該結點的孩子(Child),相應地,該結點稱爲孩子的雙親(Parent)。同一個雙親的孩子之間互稱兄弟(Sibling)。結點的祖先是從根到該結點所經分支上的全部結點。因此對於H點來講,D、B、A都是它的祖先。反之,以某結點爲根的子樹中的任一結點都稱爲該結點的子孫。B的子孫有D、G、H、I,如圖6-2-5所示。
樹的其餘相關概念:
結點的層次(Level)從根開始定義起,根爲第一層,根的孩子爲第二層。若某結點在第I層,則其子樹的根就在第I+1層。其雙親在同一層的結點互爲堂兄弟。顯然圖6-2-6中的D、E、F是堂兄弟,而G、H、I、J也是。樹中結點的最大層次稱爲樹的深度(Depth)或高度。當前樹的深度爲4。
若是將樹中結點的各子樹當作從左至右是有次序的,不能互換的,則稱爲該樹爲有序樹,不然稱爲無序樹。
森林(Forest)是m(m>=0)顆互不相交的樹的集合。
線性表與樹的結構的異同:
數的抽象數據類型:
樹的存儲結構表示:雙親表示法、孩子表示法、孩子兄弟表示法。
# 雙親表示法:在每一個結點中,附設一個指示器指示其雙親結點到鏈表中的位置。
存儲結構的設計是一個很是靈活的過程。一個存儲結構設計得是否合理,取決於基於該存儲結構的運算是否適合、是否方便,時間複雜度好很差等。
# 孩子表示法:每一個結點有多個指針域,其中每一個指針指向一顆子樹的根結點,咱們把這種方法叫作多重鏈表表示法。
把每一個結點的孩子結點排列起來,以單鏈表做存儲結構,則n個結點有n個孩子鏈表,若是是葉子結點則此單鏈表爲空。而後n個頭指針又組成一個線性表,採用順序存儲結構,存放進一個一維數組中。
# 雙親孩子表示法
# 孩子兄弟表示法:任意一棵樹,它的結點的第一個孩子若是存在就是惟一的,它的右兄弟若是存在也是惟一的。所以,咱們設置兩個指針,分別指向該結點的第一個孩子和此結點的右兄弟。