第五章 樹和二叉樹之赫夫曼樹及其編碼

2021-06-28 01:00:19 字數 1584 閱讀 7404

//已更改,之前是select函式存在問題   選出的s1與s2大小不定,故結果顯示不唯一。

#include #include 

#define error 0

#define ok 1

#define status int

#define n 1050

/*構造赫夫曼樹:n個初始結點,則赫夫曼樹中會存在2n-1個結點,0號位置不使用的情況下,共需要2n個結點;

思想: 1、初始化:將所有的單元中的雙親及其左右孩子的結點座標都初始化為0;再輸入前n個結點的值

2、通過n-1次的選擇、刪除、合併來建立赫夫曼樹:

選擇:從之前的所有結點中選擇雙親為0,並且其權值為最小的兩個;(這裡構造乙個select函式來進行選擇,選擇結果放入s1與s2中)

刪除:將選中的兩個結點的雙親改為非0;

合併:將s1和s2的權值相加,作為乙個新的結點權值,依次存入到陣列的第n+1之後的單元中,同時記錄這個新結點的左右孩子分別為s1,s2;並且雙親結點為0;

*//*

赫夫曼樹的應用:赫夫曼編碼:

選擇最優字首編碼的一種形式;

另外,赫夫曼編碼的實現是建立在已有赫夫曼樹的基礎上的;

思想:從結點開始向根結點回溯,將資料倒敘臨時存入乙個一維陣列中cd;start記錄編碼在cd中的起始位置;

當到最終的根結點時,將cd中的變法複製到該字元相應的編碼串中;

*///

結點型別:

typedef struct

lnode

lnode,*linklist;

void select(lnode f,int t,int &s1,int &s2)

else

}for(int i=1;i<=t;i++)

if(f[i].number0

) s1=i;

if(s1==s2) s2=m;

for(int i=1;i<=t;i++)

if(i!=s1 && f[i].number0

) s2=i;

if(s1>s2)

}void creat(linklist &l,int

n)//

初始化開設的陣列;

for(i=1;i<=n;i++)//

輸入前n個元素;

scanf("

%d",&l[i].number);

//我是乙個萬惡的分割線--------------------------------------初始化工作完畢!

for(i=n+1;i)

}//根據赫夫曼樹構造赫夫曼編碼:

void creat1(char hc[100][100],linklist &l,int

n)

/*hc[i]=new char[n-start];

*/strcpy(hc[i],&cd[start]);

//int p=0;

//for(j=start;j//

hc[i][p++]=cd[j];}}

intmain()

return0;

}

第五章樹和二叉樹

樹的邏輯結構 在樹中常常將資料元素稱為結點。任意一棵非空樹滿足以下條件 1 有且僅有乙個特定的稱為根的結點 2 當n 1時,除根結點之外的其餘節點被分成m m 0 個互不相交的有限集合t1,t2.tm,其中每個集合又是一棵樹,並稱為根節點的子樹。樹的定義是遞迴的。結點的度 某結點所擁有的子樹的個數 ...

第五章 樹和二叉樹

5.1 樹的邏輯結構 樹的定義 n n 0 個結點的有限集合。當n 0時,稱為空樹 任意一棵非空樹滿足以下條件 有且僅有乙個特定的稱為根的結點 當n 1時,除根結點之外的其餘結點被分成m m 0 個互不相交的有限集合t1,t2,tm,其中每個集合又是一棵樹,並稱為這個根結點的子樹。樹的基本術語 結點...

第五章樹和二叉樹

結點的度 結點所擁有的子樹的個數。樹的度 樹中各結點度的最大值。葉子結點 度為0的結點,也稱為終端結點。分支結點 度不為0的結點,也稱為非終端結點。結點所在層數 根結點的層數為1 對其餘任何結點,若某結點在第k層,則其孩子結點在第k 1層。樹的深度 樹中所有結點的最大層數,也稱高度。層序編號 將樹中...