今天在博客上看到這樣一段代碼,感受挺有意思,代碼以下:html
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)特色表示的是「多」。
樹的相關術語:
一、結點(Node):表示樹中的數據元素,由數據項和數據元素之間的關係組成。在圖中,共有10個結點。
二、結點的度(Degree of Node):結點所擁有的子樹的個數,在圖中,結點A的度爲3。
三、樹的度(Degree of Tree):樹中各結點度的最大值。在圖5.1中,樹的度爲3。
四、葉子結點(Leaf Node):度爲0的結點,也叫終端結點。在圖5.1中,結點E、F、G、H、I、J都是葉子結點。
五、分支結點(Branch Node):度不爲0的結點,也叫非終端結點或內部結點。在圖5.1中,結點A、B、C、D是分支結點。
六、孩子(Child):結點子樹的根。在圖中,結點B、C、D是結點A的孩子。
七、雙親(Parent):結點的上層結點叫該結點的雙親。在圖中,結點B、C、D的雙親是結點A。
八、祖先(Ancestor):從根到該結點所經分支上的全部結點。在圖中,結點E的祖先是A和B。
九、子孫(Descendant):以某結點爲根的子樹中的任一結點。在圖中,除A以外的全部結點都是A的子孫。
十、兄弟(Brother):同一雙親的孩子。在圖5.1中,結點B、C、D互爲兄弟。
十一、結點的層次(Level of Node):從根結點到樹中某結點所經路徑上的分支數稱爲該結點的層次。根結點的層次規定爲1,其他結點的層次等於其雙親結點的層次加1。
十二、堂兄弟(Sibling):同一層的雙親不一樣的結點。在圖中,G和H互爲堂兄弟。
1三、樹的深度(Depth of Tree):樹中結點的最大層次數。在圖5.1中,樹的深度爲3。
1四、無序樹(Unordered Tree):樹中任意一個結點的各孩子結點之間的次序構成可有可無的樹。一般樹指無序樹。
1五、有序樹(Ordered Tree):樹中任意一個結點的各孩子結點有嚴格排列次序的樹。二叉樹是有序樹,由於二叉樹中每一個孩子結點都確切定義爲是該結點的左孩子結點仍是右孩子結點。
1六、森林(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的數組存儲。
數據結構