數據結構——樹算法
定義:樹是一個n(n>=0)個結點的有序合集數據結構
名詞理解:編碼
結點:指樹中的一個元素;.net
結點的度:指結點擁有的子樹的個數,二叉樹的度不大於2;3d
數的度:指樹中的最大結點度數;指針
葉子:度爲0的結點,也稱爲終端結點;blog
高度:葉子節點的高度爲1,根節點高度最高;排序
層:根在第一層,以此類推;遞歸
二叉樹的定義:由一個結點和兩顆互不相交、分別稱爲這個根的左子樹和右子樹的二叉樹構成(遞歸定義)隊列
二叉樹的性質:
1:二叉樹的第i層上至多有2^(i-1)個結點
2:深度爲k的二叉樹,至多有2^k-1個結點
滿二叉樹:葉子節點必定要在最後一層,而且全部非葉子節點都存在左孩子和右孩子;
最特別的二叉樹:徹底二叉樹:從左到右、從上到下構建的二叉樹;
徹底二叉樹的性質:
1:結點 i 的子結點爲2*i 和 2*i+1(前提是都小於總結點數)
2:結點 i 的父結點爲 i/2
二叉樹的遍歷(要有遞歸的思想!!!):
1:先序遍歷:根->左子樹->右子樹(先序)
2:中序遍歷:左子樹->根->右子樹(中序)
3:後序遍歷:左子樹->右子樹->根(後序)
這三種遍歷方法只是訪問結點的時機不一樣,訪問結點的路徑都是同樣的,時間和空間複雜度皆爲O(n)
二叉樹的存儲結構:
1:順序存儲(只適用於徹底二叉樹)——能夠用於排序算法中的堆排序
2:鏈式存儲(最廣泛的存儲方式)——因爲結點可能爲空,因此會比較浪費空間
若是有n個節點,則有2n個left、right指針,可是用到的只有n-1個指針
3:線索存儲(改進的方法)
關於霍夫曼編碼(Huffman編碼):
Huffman是一種前綴編碼;Huffman編碼是創建在Huffman樹的基礎上進行的,所以爲了進行Huffman編碼,必須先構建Huffman樹;樹的路徑長度是每一個葉節點到根節點的路徑之和;帶權路徑長度是(每一個葉節點的路徑長度*wi)之和;Huffman樹是最小帶權路徑長度的二叉樹;
構造Huffman樹的過程:
(1)將各個節點按照權重從小到大排序;
(2)取最小權重的兩個節點,並新建一個父節點做爲這兩個節點的雙親,雙親節點的權重爲子節點權重之和,再將此父節點放入原來的隊列;
(3)重複(2)的步驟,直到隊列中只有一個節點,此節點爲根節點;
構造完Huffman樹以後,就能夠進行Huffman編碼了,編碼規則:左分支填0,右分支填1;
Huffman解碼過程:給定一個01串,將01串進行Huffman樹,到葉子節點了就代表已經解碼一個節點,而後再次遍歷Huffman樹;