最優二叉樹(哈夫曼樹):給定n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi。構造出來的二叉樹的形態可以有多個,我們把其中帶權路徑長度wpl最小的二叉樹稱作最優二叉樹或者哈夫曼樹。
語言描述:
①根據給定的n個權值構成n棵二叉樹的集合f=,其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左右子樹為空。
②在f中選取兩棵根結點的權值最小的樹作為左右子樹構造一棵新的二叉樹,且置新的二叉樹的根結點的權值為其左右子樹上根結點的權值之和。
③在f中刪除這兩棵樹,同時將新得到的二叉樹加入f中。
④重複②和③,直到f只含一棵樹為止。這棵樹便是哈夫曼樹。
/*示例
****哈夫曼編碼****
請輸入結點個數:8
輸入這8個元素的權值(均為整形):
1:27
2:43:87
4:21
5:26:21
7:18:25
*/#include #include #include typedef struct
htnode, *huffmantree; //動態分配陣列,儲存哈夫曼樹
typedef char *huffmancode; //動態分配陣列,儲存哈夫曼樹
///選擇兩個parent為0,且weight最小的結點s1和s2
void select(huffmantree *ht,int n,int *s1,int *s2)
} for(i=1; i<=n; i++) }
*s1=min;
for(i=1; i<=n; i++) }
for(i=1; i<=n; i++) }
*s2=min;
}///構造哈夫曼樹ht,w存放已知n個權值
void crthuffmantree(huffmantree *ht,int *w,int n)
for(i=n+1; i<=m; i++) //非葉子結點的初始化
printf("\n?哈夫曼樹為: \n");
for(i=n+1; i<=m; i++) //建立非葉子結點,建哈夫曼樹
printf("\n");
} //從葉子結點到根,逆向求每個葉子結點對應的哈夫曼編碼
void crthuffmancode(huffmantree *ht, huffmancode *hc, int n)
else
}hc[i]=(char *)malloc((n-start)*sizeof(char)); //為第i個編碼分配空間
strcpy(hc[i],&cd[start]); //將cd複製編碼到hc
} free(cd);
for(i=1; i<=n; i++)
printf(" 權值為%d的哈夫曼編碼為:%s\n",(*ht)[i].weight,hc[i]);
for(i=1; i<=n; i++)
w+=(*ht)[i].weight*a[i];
printf(" 帶權路徑為:%d\n",w);
}int main()
crthuffmantree(&ht,w,n);
crthuffmancode(&ht,&hc,n);
system("pause");
return 0;
}
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...
哈夫曼樹 最優二叉樹
差點忘記寫部落格了.哈夫曼樹 其實就是只利用葉子結點來儲存要用資訊的樹,只不過它在構造的時候就擁有了乙個迷人的特性.就是wpl 帶權路徑長度 是最小的.而且還能用這個樹的來為葉子結點中的資訊進行編碼,得出來的各個編碼一定不會相同,並且不會產生混淆的情況.通過哈夫曼樹的特點.實現了根據乙個佇列來建立一...
最優二叉樹 哈夫曼樹
哈夫曼樹是一種帶權路徑長度最短的二叉樹,也稱為最優二叉樹。帶權路徑長度 wpl 設二叉樹有n個葉子結點,每個葉子結點帶 有權值 wk,從根結點到每個葉子結點的長度為 lk,則每個葉子結 點的帶權路徑長度之和就是 wpl 如何計算帶權路徑長度?根節點記為第0層,帶權路徑長度 如何構造哈夫曼樹 哈夫曼樹...