最优二叉树(哈夫曼树)
一,最优二叉树(哈夫曼树)
给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树。
最优二叉树是带权路径长度最短的树,权值较大的结点离根较近。
最优二叉树是Full Binary Tree ()
二,哈夫曼编码
以下是大一数据结构的实验课题:
根据所提供的字母数据建立一个Huffman树;
根据生成的Huffman树的结构,显示输出所有字母的Huffman编码。
代码:
#include <iostream>; using namespace std; struct huff { int weight; //weight用来保存权数 int parent = 0; int lchild = 0; int rchild = 0; }; void code(char ch, huff huffman[]) //给每个字符编码 { int i = 0; //i是字符ch的序号 if (ch != )i = ch - a + 1; int coding[27]; //记录编码 int number = 0; int temp = i; while (huffman[temp].parent) { int t = huffman[temp].parent; if (huffman[t].lchild == temp)coding[number] = 0; else coding[number] = 1; temp = t; number++; } for (int j = number - 1; j >= 0; j--)cout << coding[j]; } int _tmain(int argc, _TCHAR* argv[]) { huff huffman[53]; int frequency[27] = { 186, 64, 13, 22, 32, 103, 21, 15, 47,57, 1, 5, 32, 20, 57, 63, 15, 1, 48, 51, 80, 23, 8, 18, 1, 16, 1 }; huffman[0].weight = 186; for (int i = 1; i < 27; i++) //权数初始化 { huffman[i].weight = frequency[i]; huffman[i + 26].weight = 0; } for (int i = 27; i < 53; i++) //建立huffman树 { int min1 = 0; int min2 = 1; for (int j = 2; j < i; j++) //一次循环找出2个最小的权(父亲要为0的) { if (huffman[min1].parent)min1 = j; else if (huffman[min2].parent)min2 = j; else if (!huffman[j].parent) { if (huffman[j].weight < huffman[min1].weight)min1 = j; else if (huffman[j].weight < huffman[min2].weight)min2 = j; } } huffman[i].weight = huffman[min1].weight + huffman[min2].weight; huffman[min1].parent = i; //记下父亲和孩子 huffman[min2].parent = i; huffman[i].lchild = min1; huffman[i].rchild = min2; } cout << "空格的编码是"; code( , huffman); for (int i = 0; i < 26; i++) { char ch = a + i; cout << endl << ch << "的编码是" << " "; code(ch, huffman); } system("pause>nul"); return 0; }
运行结果:
上一篇:
IDEA上Java项目控制台中文乱码