樹這個資料結構用到了遞迴的概念:樹的子樹還是樹;
度:節點的子樹個數;
樹的度:樹中任意節點的度的最大值;
兄弟:兩節點的parent相同;
層:根在第一層,以此類推;
高度:葉子節點的高度為1,根節點高度最高;
有序樹:樹中各個節點是有次序的;
森林:多個樹組成;
1.雙親表示法:每個節點儲存:資料、parent在陣列中的下標;
2.孩子表示法:全部節點組成乙個陣列,每個陣列指向乙個單鏈表,存放其孩子;如下圖:
3.雙親孩子表示法
4.孩子兄弟表示法
此種方法的好處在於乙個多叉樹能夠轉換成一顆二叉樹,是樹轉換成二叉樹的好辦法;
線性表是樹的特殊情況;
斜樹:所有節點只有左節點或右節點;比如:
滿二叉樹:葉子節點一定要在最後一層,並且所有非葉子節點都存在左孩子和右孩子;
完全二叉樹:從左到右、從上到下構建的二叉樹;比如:
1.第i層至多有
2.深度為k的樹最多有2^k -1個節點;
3.任意二叉樹,度為0的節點數=度為2的節點數+1;
4.如果i為父親的編號,則孩子的編號為2i和2i+1;
5.如果孩子的編號為k,則父親的編號為floor(k/2);
(1)順序儲存:只適用於完全二叉樹;
(2)鏈式儲存:最通用的儲存方法;
但是這樣很浪費空間,因為會有很多空指標(如果有n個節點,則有2n個left、right指標,但是用到的只有n-1個指標)
改進:線索二叉樹:將空指標鏈結到前驅或後繼節點;(此處前驅和後繼是按照中序遍歷上講的)
節點資料結構如下圖:
比如:一般構造線索二叉樹的過程步驟如下:
(1)構造一般二叉樹;
(2)遍歷二叉樹的同時,建立線索二叉樹;
(1)前序遍歷:先雙親、再左孩子、最後右孩子;
(2)中序遍歷:先左孩子、再雙親、最後右孩子;
(3)後序遍歷:先左孩子、再右孩子、最後雙親;
(4)層次遍歷:一層一層,從左到右、從上到下遍歷;
注意:(1)已知前序、後序遍歷結果,不能推導出一棵確定的樹;
(2)已知前序、中序遍歷結果,能夠推導出後序遍歷結果;
(2)已知後序、中序遍歷結果,能夠推導出前序遍歷結果;
對於一般二叉樹的擴充,為了能夠通過乙個遍歷序列建立二叉樹,擴充套件二叉樹如圖所示:
如果存在遍歷序列:ab##c##,則可以很容易的建立二叉樹;
此種方式很方便,因為一般來說都需要三種遍歷方式中的兩種才可以確定乙個二叉樹;
根據兄弟孩子表示法進行轉換;
huffman是一種字首編碼;
huffman編碼是建立在huffman樹的基礎上進行的,因此為了進行huffman編碼,必須先構建huffman樹;
樹的路徑長度是每個葉節點到根節點的路徑之和;
帶權路徑長度是(每個葉節點的路徑長度*wi)之和;
huffman樹是最小帶權路徑長度的二叉樹;
構造huffman樹的過程:
(1)將各個節點按照權重從小到大排序;
(2)去最小權重的兩個節點,並新建乙個父節點作為這兩個節點的雙親,雙親節點的權重為子節點權重之和,再將此父節點放入原來的佇列;
(3)重複(2)的步驟,直到佇列中只有乙個節點,此節點為根節點;
構造完huffman樹之後,就可以進行huffman編碼了,編碼規則:
(1)左分支填0,右分支填1;
huffman解碼過程
(1)給定乙個01串,將01串進行huffman樹,到葉子節點了就表明已經解碼乙個節點,然後再次遍歷huffman樹;
資料結構 樹
樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...
資料結構 樹
1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...
資料結構 樹
二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...