資料結構 樹

2021-07-22 13:45:51 字數 1781 閱讀 4210

樹這個資料結構用到了遞迴的概念:樹的子樹還是樹;

度:節點的子樹個數;

樹的度:樹中任意節點的度的最大值;

兄弟:兩節點的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 二...

資料結構 樹

二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...