最優二叉樹的特點:
演算法描述
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 存放哈夫曼編碼的陣列,初始化...