樹的定義
為了保證資料的能夠有效的查詢,可以使用順序結構。為了保證資料的插入效率,我們可以使用鏈型結構。但在某些場合,我們需要同時兼顧查詢效率和插入的效率,應該怎麼做?
樹(tree)型結構是一類常用的高效的非線性的資料結構,兼顧了順序表的查詢效率和鍊錶的插入效率。例如我們電腦中的目錄結構,採用的就是一種樹形結構關係。 樹的具體結構形狀如下圖:
關於樹有以下幾個定義:
度:每個節點擁有的葉子的個數稱之為度。a節點的度是3
樹的度:是指節點的最大值,當前樹的度是4。
根節點:樹的開始節點,a節點是根節點
葉子節點:沒有子節點的節點,k、l、f節點是葉子節點
為什麼樹能夠保持較高的查詢和插入效率,對比順序結構, 順序結構的查詢效率的時間複雜度為o(1),插入的效率為o(n),鏈式結構正好相反。
如果我們把資料結構由線形結構轉成樹形結構的話,查詢和遍歷節點的數量一定是小於等於n,所以樹的效率一般是優於線性結構。
樹的儲存形式
雙親表示法
雙親表示法是指用順序結構來表示數,每個節點設定乙個變數,來指示雙親節點所在的位置,如下:
孩子表示法
每個節點可能有多個子節點,可以用使用多級鍊錶來分別表示。具體如下
孩子兄弟表示法
又稱為二叉樹表示法,是以二叉鍊錶的方式進行儲存。表示如下:
二叉樹二叉樹是一種特殊的樹型結構,有乙個根節點和最多有兩個子節點(每個節點的度不大於2)。稱為二叉樹。
滿二叉樹:乙個深度為k的二叉樹,有2k-1個節點,即除最底層的節點外,其他節點都有兩個葉子節點。
完全二叉樹 除了葉子節點不滿,其他都滿。且最下面一層節點如果不滿,則所有的節點在左邊的連續排列,空位都在右邊。這樣的二叉樹就是一棵完全二叉樹。滿二叉樹是特殊的完全二叉樹。
二叉查詢樹: 又名二叉搜尋樹,二叉排序樹,即在插入的時候,值的大小就決定了在二叉樹中的位置。
具有以下性質:
若任意節點的左子樹不空,則左子樹上所有結點的值小於它的根結點的值;
若任意節點的右子樹不空,則右子樹上所有結點的值大於它的根結點的值;
任意節點的左、右子樹也分別為二叉查詢樹;
沒有鍵值相等的節點。
如下圖
平衡二叉樹:前面我們看到了二叉查詢樹的特點,如果當根節點擊擇不當的時候,會出現左右失衡的現象,比如:
如果我們查詢的資料是160的話,需要遍歷深度為6。如果我們在插入的時候能讓樹保持在乙個合理的深度,每次插入進行平衡,這樣檢索的效率會不會提公升?這就是我們要引入的平衡二叉樹,明確定義是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹,我們把上圖進行整理成平衡二叉樹。結果如下:
這樣在查詢160的時候,只需要遍歷深度為3. 但平衡二叉樹在插入資料的會造成失衡,所以平衡二叉樹修改時候比二叉搜尋樹更加複雜。
紅黑樹:紅黑樹是帶有紅黑標記的二叉查詢樹,除了排序的屬性有多了顏色的屬性
紅黑樹除了具有查詢的樹的特點外,還具有具有以下特點:
根節點一定是黑色的,節點非黑即紅
每個紅節點的兩個子節點都是黑色的、
任意節點到每個葉子節點的所有路徑都包含相同的黑色節點
葉子節點都是黑色(null)節點
如果我們將乙個資料185插入到上面的樹的節點中,過程如下:
霍夫曼樹: 是一種帶有權重的最優二叉樹。 首先看乙個例子:
上面有三顆樹,我們把葉子節點到根節點的權重和深度乘積的和稱為權重路徑長度 (wpl) 則上面三顆樹的長度分別為:
wpl= 72+52+22+42=36
wpl= 73+53+21+42=46
wpl= 71+52+23+43=35
從上面的結果可以看出第3棵為最小,也可以證明第3棵是最優二叉樹, 所以霍夫曼樹的特點就權重最大的節點路徑為最短,這樣能使整顆樹的權重路徑長度最小。
霍夫曼樹常用的字串的縮減,稱為霍夫曼編碼,能夠有效的降低編碼的長度。
樹的雙親表示法,孩子表示法以及孩子兄弟表示法
目錄如下圖所示,這是一棵普通的樹,該如何儲存呢?通常,儲存具有普通樹結構資料的方法有 3 種 雙親表示法 孩子表示法 孩子兄弟表示法 圖1雙親表示法採用順序表 也就是陣列 儲存普通樹,其實現的核心思想是 順序儲存各個節點的同時,給各節點附加乙個記錄其父節點位置的變數。注意,根節點沒有父節點 父節點又...
樹的儲存結構 雙親表示法 孩子表示法 孩子兄弟法
實現 定義結構陣列存放樹的結點,每個結點包含兩個域 結點結構 結點型別定義 typedef struct ptnode ptnode 另外,用r儲存根結點的下標,用n表示結點個數 樹的雙親表示法示例 樹結構型別定義 define max tree size 100 typedef struct pt...
樹 孩子兄弟表示法的實現
樹狀圖是一種資料結構,它是由n n 1 個有限節點組成乙個具有層次關係的集合。把它叫做 樹 是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。它具有以下的特點 每個節點有零個或多個子節點 沒有父節點的節點稱為根節點 每乙個非根節點有且只有乙個父節點 除了根節點外,每個子節點可以分為多個不...