數據結構——樹
定義:樹是一個n(n>=0)個結點的有序合集
名詞理解:
結點:指樹中的一個元素;
結點的度:指結點擁有的子樹的個數,二叉樹的度不大於2;
數的度:指樹中的最大結點度數;
葉子:度為0的結點,也稱為終端結點;
高度:葉子節點的高度為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樹;