貪婪演算法 哈夫曼樹的構建及編碼

2021-08-27 16:28:19 字數 2613 閱讀 8634

最優二叉樹的特點:

演算法描述

1.定義節點型別

//節點的結構

typedef

struct nodehuffnode;

2.定義森林陣列並初始化
huffnode **f;//指向動態陣列的指標

int n;//陣列的長度

//從鍵盤輸入陣列長度

printf("請輸入陣列長度:");

scanf("%d",&n);

//定義儲存森林的陣列

f = (huffnode **)malloc(n*sizeof(huffnode*));

//初始化森林

for(int i = 0;iint w;//表示權重

char ch;//表示節點

//新建二叉樹節點

f[i] = (huffnode*)malloc(sizeof(huffnode));

printf("請輸入節點的表示");

scanf("%c",ch);

printf("請輸入節點的權重:");

scanf("%d",w);

f[i]->word = ch;

f[i]->weight = w;

f[i]->left = f[i]->right = null;

}

3.最優二叉樹的構建

思路:輸入的節點只能是葉子結點。所以構建二叉樹的過程,就是建立雙親節點。根據最優二叉樹的特點(若葉子節點的個數是n,那麼雙親節點的個數是n-1),構建最優二叉樹的迴圈次數為n-1次。而在每一迴圈中,都要從森林中獲取最小以及次小的二叉樹,作為新二叉樹的左右節點,並返回森林,參與下一次迴圈

//構建最優二叉樹

huffnode *createhufftree(huffnode **f,int n)else

if(f[i])

}//獲取最小以及次小節點的位置

for(int j = k2;j < n;j++)else

if(f[j]->weight < f[k2]->weight)}}

//生成新的節點

newf = (huffnode*)malloc(sizeof(huffnode));

//將找到的最小以及次小節點掛到新的節點

newf->left = f[k1];

newf->right = f[k2];

newf->weight = f[k2]->weight + f[k1]->weight;

newf->word = ' ';

//將新生成的節點放回森林

f[k1] = newf;

f[k2] = null;

}return newf;

}

演算法描述

1.定義節點的型別

//定義節點的型別

typedef

struct huff;

2.定義森林陣列並初始化

思路:在節點初始化過程中,左右子節點以及它的雙親節點設為-1

huff *f;//表示節點

int n;//表示節點的個數

printf("請輸入節點個數");

scanf("%d",&n);

fflush(stdin);

f = (huff *)malloc((2*n-1)* sizeof(huff));//申明指標陣列

//初始化節點並存入陣列

for (int i = 0; i < n; ++i)

3.構建最優二叉樹

思路:

//構造最優二叉樹

void createhufftree(huff *f,int n)else

if(f[j].weight < f[k2].weight)}}

//跳出迴圈後,j正好表示緊接著已分配的陣列元素的尚未分配的陣列元素

//雙親節點的設定

f[j].word = ' ';

f[j].left = k1;

f[j].right = k2;

f[j].weight = f[k1].weight + f[k2].weight;

f[j].parent = -1;

f[j].code = null;

//左右子節點雙親節點的設定

f[k1].parent = f[k2].parent = j;

}}

4.求出葉子結點的哈夫曼編碼並儲存到code指標指向的陣列

//儲存哈夫曼編碼

void createhuffcode(huff *f,int n)

else

if (f[p].right ==c)

c = p;}}

}

5.輸出哈夫曼編碼

//輸出哈夫曼編碼

void printhuffmancode(huff *f,int n)

printf("\n");

}}

哈夫曼樹及哈夫曼編碼

哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...

哈夫曼樹及哈夫曼編碼

給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。樹節點間的邊相關的數叫做權。從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目...

構建哈夫曼樹,並輸出哈夫曼編碼

輸入條件 輸入從小到大排列的n個正整數,作為葉子的權值,共同完成構建具有n片葉的,根指標為hroot的哈夫曼樹 1 程式前部的定義 include include include define max 999 監督元 define n 6 n個葉子節點 char s 6 存放哈夫曼編碼的陣列,初始化...