數據結構--樹形結構


今天在博客上看到這樣一段代碼,感覺挺有意思,代碼如下:

 1 public class Edge {
 2     //Name of origin town
 3     public Node origin;
 4     //Name of destination town
 5     public Node destination;
 6     //Route weight to destination
 7     public int weight;
 8     //next possible route
 9     public Edge next;
10     //constructor
11     public Edge(Node origin, Node destination, int weight) {
12         this.origin         = origin;
13         this.destination    = destination;
14         this.weight         = weight;
15         this.next         = null;
16     }
17 
18     public Edge next(Edge edge) {
19         this.next = edge;
20         return this;
21     }
22 }
23 
24 graph.routeTable.put(a, new Edge(a, b, 5).next(new Edge(a, d, 5).next(new Edge(a, e, 7))));

我想到了樹形結構,但還是有爭議,有人說它是鄰接鏈表,不知大家怎么看?總之還是先回顧下樹形吧。

樹形結構-- 一對多的關系
數據結構中,使用樹形結構表示數據表素之間一對多的關系,樹形結構是一種非線型結構.
定義:
樹(Tree)是n(n≥0)個相同數據類型的數據元素的集合.樹中的數據元素稱為節點(Node).。n=0的樹稱為空樹(Empty Tree);對於n>0的任意非空樹T有:
(1)有且僅有一個特殊的結點稱為樹的根(Root)結點,根沒有前驅結點;
(2)若n>1,則除根結點外,其余結點被分成了m(m>0)個互不相交的集合T1,T2,…,Tm,其中每一個集合Ti(1≤i≤m)本身又是一棵樹。樹T1,T2,…,Tm稱為這棵樹的子樹(Subtree)。
由樹的定義可知,樹的定義是遞歸的,用樹來定義樹。因此,樹(以及二叉樹)的許多算法都使用了遞歸。
樹的形式定義為:樹(Tree)簡記為T,是一個二元組,
T = (D, R)
其中:D是結點的有限集合;
R是結點之間關系的有限集合。

樹具有下面兩個特點:
(1)樹的根結點沒有前驅結點,除根結點之外的所有結點有且只有一個前驅結點。
(2)樹中的所有結點都可以有零個或多個后繼結點。
實際上,第(1)個特點表示的就是樹形結構的“一對多關系”中的“一”,第(2)特點表示的是“多”。




樹的相關術語:
1、結點(Node):表示樹中的數據元素,由數據項和數據元素之間的關系組成。在圖中,共有10個結點。
2、結點的度(Degree of Node):結點所擁有的子樹的個數,在圖中,結點A的度為3。
3、樹的度(Degree of Tree):樹中各結點度的最大值。在圖5.1中,樹的度為3。
4、葉子結點(Leaf Node):度為0的結點,也叫終端結點。在圖5.1中,結點E、F、G、H、I、J都是葉子結點。
5、分支結點(Branch Node):度不為0的結點,也叫非終端結點或內部結點。在圖5.1中,結點A、B、C、D是分支結點。
6、孩子(Child):結點子樹的根。在圖中,結點B、C、D是結點A的孩子。
7、雙親(Parent):結點的上層結點叫該結點的雙親。在圖中,結點B、C、D的雙親是結點A。
8、祖先(Ancestor):從根到該結點所經分支上的所有結點。在圖中,結點E的祖先是A和B。
9、子孫(Descendant):以某結點為根的子樹中的任一結點。在圖中,除A之外的所有結點都是A的子孫。
10、兄弟(Brother):同一雙親的孩子。在圖5.1中,結點B、C、D互為兄弟。
11、結點的層次(Level of Node):從根結點到樹中某結點所經路徑上的分支數稱為該結點的層次。根結點的層次規定為1,其余結點的層次等於其雙親結點的層次加1。
12、堂兄弟(Sibling):同一層的雙親不同的結點。在圖中,G和H互為堂兄弟。
13、樹的深度(Depth of Tree):樹中結點的最大層次數。在圖5.1中,樹的深度為3。
14、無序樹(Unordered Tree):樹中任意一個結點的各孩子結點之間的次序構成無關緊要的樹。通常樹指無序樹。
15、有序樹(Ordered Tree):樹中任意一個結點的各孩子結點有嚴格排列次序的樹。二叉樹是有序樹,因為二叉樹中每個孩子結點都確切定義為是該結點的左孩子結點還是右孩子結點。
16、森林(Forest):m(m≥0)棵樹的集合。自然界中的樹和森林的概念差別很大,但在數據結構中樹和森林的概念差別很小。從定義可知,一棵樹有根結點和m個子樹構成,若把樹的根結點刪除,則樹變成了包含m棵樹的森林。當然,根據定義,一棵樹也可以稱為森林。

樹的邏輯表示


二叉樹的定義(BinaryTree):
每個節點至多有兩個子樹。
二叉樹有左右之分,不可顛倒。如果把左右子樹順序顛倒則變了另一個全新的二叉樹。
二叉樹具有5種形態:


1)滿二叉樹(Full Binary Tree):如果一棵二叉樹只有度為0的結點和度為2的結點,並且度為0的結點在同一層上,則這棵二叉樹為滿二叉樹,如圖所示。
由定義可知,對於深度為k的滿二叉樹的結點個數為2k-1。(24-1=15)

(2)完全二叉樹(Complete Binary Tree):深度為k,有n個結點的二叉樹當且僅當其每一個結點都與深度為k,有n個結點的滿二叉樹中編號從1到n的結點一一對應時,稱為完全二叉樹,如圖所示。完全二叉樹的特點是葉子結點只可能出現在層次最大的兩層上,並且某個結點的左分支下子孫的最大層次與右分支下子孫的最大層次相等或大1。


二叉樹的性質
性質1 一棵非空二叉樹的第i層上最多有2i-1個結點(i≥1)。
性質2 若規定空樹的深度為0,則深度為k的二叉樹最多有2k-1個結點(k≥0)。
性質3 具有n個結點的完全二叉樹的深度k為log2n+1。
性質4 對於一棵非空二叉樹,如果度為0的結點數目為n0,度為2的結點數目為n2,則有n0= n2+1。
性質5 對於具有n個結點的完全二叉樹,如果按照從上到下和從左到右的順序對所有結點從1開始編號,則對於序號為i的結點,有:
(1)如果i>1,則序號為i的結點的雙親結點的序號為i/2(“/”表示整除);如果i=1,則該結點是根結點,無雙親結點。
(2)如果2i≤n,則該結點的左孩子結點的序號為2i;若2i>n,則該結點無左孩子。
(3)如果2i+1≤n,則該結點的右孩子結點的序號為2i+1;若2i+1>n,則該結點無右孩子。



二叉樹的存儲結構--順序存儲
順序存儲:
1 把一個滿二叉樹從上到下,從左到右順序編號,依次放到數組中,可得到如圖示結果。
2 設滿二叉樹節點在數組中的索引為i,那么有如下性質:

      (1)如果i=0,此節點為根節點,無雙親。
      (2)如果i>0,則其雙親為(i-1)/2。(結果取整)
      (3)結點i的左孩子為2i+1,右孩子為2i+2.
      (4)
 當i>0時,當i為奇數時,它是雙親節點的左孩子,它的兄弟為i+1;當i為偶數時,它是雙親節點的右孩子,它的兄弟為i-1.
      (5)
 深度為K的滿二叉樹需要長度為2k
-1的數組存儲。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM