樹形結構是一種非線性結構,樹中每個結點的都有關系性,生活中族譜、大學機構等都是樹形結構,在計算機中編譯程序用來表示源代碼的語法結構,數據庫索引,計算機圖形表示圖像關系等。
樹的定義是,n(n >= 0)個結點的有限集T。它或是空集(空樹即 n = 0),或者非空集。對於任意一棵非空樹,有且僅有一個特定為根結點,當n > 1時,其余結點可以分為m個互不相交的有限集,其中每個集合本身又是一棵樹,並稱為根的子樹
樹的表示方法有,樹形表示,嵌套集合表示,凹型表示,廣義表表示。
對於樹重要概念:
1.度,一個結點擁有的子樹數稱為該結點的度,一棵樹中最大度數稱為樹的度。度數為0的結點稱為葉子或終端結點。
2.深度,樹的層次從根開始計算,樹中結點最大層次數為數的深度或高度。
3.樹中結點的各子樹看成從左到右依次有序排列且不能交換,稱為有序樹,否則無序樹。
4.森林,是m(m > = 0)棵互不相交的樹的集合,若一棵樹根結點刪除,就獲取該樹的子樹構成的森林,如果把森林所有樹作為子樹,用一個根結點把子樹連接起來,森林變成一棵樹。
二叉樹定義是n個結點有限的集合,它的每個節點至多有兩個子樹。有滿二叉樹和完全二叉樹,滿二叉樹只有度為2的結點,完全二叉樹是滿足最深層的葉子結點都在左邊位置。
二叉樹的性質:
1.在二叉樹的第i層至多有2^(n-1)個結點。
2.深度為k的二叉樹至多有2^k-1個結點(k>=1)。
3.對於任何一棵二叉樹,若終端結點數為n0,度數為2的結點為n2,,則n0=n2+1。
4.具有n個結點的完全二叉樹的深度為[logn] + 1 或 [log(n+1)]。
二叉樹的存儲結構
1.順序存儲具有n個結點的完全二叉樹時,從樹根從上到下依次每層從左往右給每個結點編號,並獲得一個線性表,但是如果不是完全二叉樹就會產生存儲空間的浪費。
2.鏈式存儲結構一般每個結點設置三個域,值域、左指針域和右指針域。如果方便查找父節點可以添加一個parent域。
二叉樹的生成方式:
1.按廣義表表示二叉樹結構生成二叉鏈表的算法。
2.按完全二叉樹的層次順序依次輸入結點信息建立二叉鏈表的算法。
二叉樹的遍歷:
1.遞歸遍歷:前序遍歷,中序遍歷,后序遍歷。
2.非遞歸遍歷:棧遍歷,隊列遍歷。
二叉樹的線索化:對於一棵二叉線索鏈表結構中所以結點的空指針域按照某種遍歷次序加線索的過程稱為線索化。線索化為了有效利用存儲空間進一步利用二叉樹的通過轉換成二叉雙向鏈表的方式。
具體思路:
(1)如果根結點的左孩子指針域為空,就把前驅結點的指針賦給根結點左指針。
(2)如果根結點的右孩子指針域為空,就把后繼節點的指針賦給根結點右指針。
(3)將根結點賦給存給前驅指針的變量,方便下次訪問時獲取根結點的前驅結點。
最優二叉樹(哈夫曼樹):帶權路徑長度最短的樹。完全二叉樹是最優二叉樹的代表例子。
結點的帶權路徑長度:樹根到某結點之間的路徑長度與該結點上的權的乘積。
樹的帶權路徑長度:樹中所有葉子結點的帶權路徑之和。
構建哈夫曼樹算法思想:
(1)根據n個權值和n個結點對應構成n棵二叉樹的森林F,其中每棵二叉樹都只有一個權值的根結點,左右子樹都是空。
(2)在森林F選兩個根結點權值最小的樹作為新樹的左右子樹,且把新樹的根結點權值換成最小子樹的權值之和。
(3)F刪除選擇的兩個樹,添加新樹到F中。
(4)重復2,3步,直到F只有一棵樹為止。