生成一棵赫夫曼树
来源:互联网 发布:淘宝上的三星s8靠谱吗 编辑:程序博客网 时间:2024/06/02 02:23
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
struct NODE
{
int weight;//权值
char c;
NODE *left, *right;
};
struct DATA
{
int weight;
char c;//如果c不是0则左右孩子都是NULL,表示是叶子结点;否则是中间结点
};
struct COMP
{
bool operator()(const DATA &data1, const DATA &data2)
{
return data1.weight < data2.weight;
}
};
void CreatHufmanTree(NODE **T, std::vector<DATA> &dataVec)
{
while(dataVec.size() != 1)
{
std::sort(dataVec.begin(), dataVec.end(), COMP());
DATA data1 = dataVec.front();
DATA data2 = *(dataVec.begin() + 1);
dataVec.erase(dataVec.begin());
dataVec.erase(dataVec.begin());
NODE *tmp1;
if(data1.c != 0)
{
//叶子结点
tmp1 = new NODE;
tmp1->left = NULL;
tmp1->right = NULL;
tmp1->c = data1.c;
tmp1->weight = data1.weight;
}
else if(0 == data1.c)
{
//中间结点
tmp1 = *T;
tmp1->c = 0;
tmp1->weight = data1.weight;
}
NODE *tmp2;
if(data2.c != 0)
{
//叶子结点
tmp2 = new NODE;
tmp2->left = NULL;
tmp2->right = NULL;
tmp2->c = data2.c;
tmp2->weight = data2.weight;
}
else if(0 == data2.c)
{
//中间结点
tmp2 = *T;
tmp2->c = 0;
tmp2->weight = data2.weight;
}
NODE *node = new NODE;
node->weight = data1.weight + data2.weight;
node->c = 0;
node->left = tmp1;
node->right = tmp2;
*T = node;
DATA tmp;
tmp.c = 0;
tmp.weight = node->weight;
dataVec.insert(dataVec.begin(), tmp);
}
}
void PrintTree(NODE *T, std::string &str)
{
NODE *p = T;
if(p)
{
if(p->c != 0)
{
std::cout << str << ": " << p->c << std::endl;
return;
}
if(p->left)
{
str += "0";
}
PrintTree(p->left, str);
str.erase(str.end() - 1);
if(p->right)
{
str += "1";
}
PrintTree(p->right, str);
str.erase(str.end() - 1);
}
}
int main(int nArgs, char* pArg[])
{
std::vector<DATA> dataVec;
DATA d;
d.c = 'A';
d.weight = 5;
dataVec.push_back(d);
d.c = 'B';
d.weight = 15;
dataVec.push_back(d);
d.c = 'C';
d.weight = 40;
dataVec.push_back(d);
d.c = 'D';
d.weight = 30;
dataVec.push_back(d);
d.c = 'E';
d.weight = 10;
dataVec.push_back(d);
NODE *t = NULL;
NODE **T = &t;
CreatHufmanTree(T, dataVec);
std::string str = "";
PrintTree(*T, str);
system("pause");
return 0;
}
#include <algorithm>
#include <vector>
#include <string>
struct NODE
{
int weight;//权值
char c;
NODE *left, *right;
};
struct DATA
{
int weight;
char c;//如果c不是0则左右孩子都是NULL,表示是叶子结点;否则是中间结点
};
struct COMP
{
bool operator()(const DATA &data1, const DATA &data2)
{
return data1.weight < data2.weight;
}
};
void CreatHufmanTree(NODE **T, std::vector<DATA> &dataVec)
{
while(dataVec.size() != 1)
{
std::sort(dataVec.begin(), dataVec.end(), COMP());
DATA data1 = dataVec.front();
DATA data2 = *(dataVec.begin() + 1);
dataVec.erase(dataVec.begin());
dataVec.erase(dataVec.begin());
NODE *tmp1;
if(data1.c != 0)
{
//叶子结点
tmp1 = new NODE;
tmp1->left = NULL;
tmp1->right = NULL;
tmp1->c = data1.c;
tmp1->weight = data1.weight;
}
else if(0 == data1.c)
{
//中间结点
tmp1 = *T;
tmp1->c = 0;
tmp1->weight = data1.weight;
}
NODE *tmp2;
if(data2.c != 0)
{
//叶子结点
tmp2 = new NODE;
tmp2->left = NULL;
tmp2->right = NULL;
tmp2->c = data2.c;
tmp2->weight = data2.weight;
}
else if(0 == data2.c)
{
//中间结点
tmp2 = *T;
tmp2->c = 0;
tmp2->weight = data2.weight;
}
NODE *node = new NODE;
node->weight = data1.weight + data2.weight;
node->c = 0;
node->left = tmp1;
node->right = tmp2;
*T = node;
DATA tmp;
tmp.c = 0;
tmp.weight = node->weight;
dataVec.insert(dataVec.begin(), tmp);
}
}
void PrintTree(NODE *T, std::string &str)
{
NODE *p = T;
if(p)
{
if(p->c != 0)
{
std::cout << str << ": " << p->c << std::endl;
return;
}
if(p->left)
{
str += "0";
}
PrintTree(p->left, str);
str.erase(str.end() - 1);
if(p->right)
{
str += "1";
}
PrintTree(p->right, str);
str.erase(str.end() - 1);
}
}
int main(int nArgs, char* pArg[])
{
std::vector<DATA> dataVec;
DATA d;
d.c = 'A';
d.weight = 5;
dataVec.push_back(d);
d.c = 'B';
d.weight = 15;
dataVec.push_back(d);
d.c = 'C';
d.weight = 40;
dataVec.push_back(d);
d.c = 'D';
d.weight = 30;
dataVec.push_back(d);
d.c = 'E';
d.weight = 10;
dataVec.push_back(d);
NODE *t = NULL;
NODE **T = &t;
CreatHufmanTree(T, dataVec);
std::string str = "";
PrintTree(*T, str);
system("pause");
return 0;
}
- 生成一棵赫夫曼树
- java生成密码生成
- php生成pdf生成
- qrcode生成,二维码生成
- 生成、重新生成、清理
- 生成直方图
- 生成助记码
- 生成随机数
- 生成日历
- 生成xml
- 生成校验码
- 生成HTML
- 生成订单号
- 生成缩略图
- 生成条形码
- 生成缩略图
- 生成HTML
- 生成组件
- 过去的就让它过去
- directshow render 示例代码
- 黑马程序员 Java自学总结十九 Java高新技术第二天
- 宣泄管理——钱诗金
- Android ndk 中使用STL .
- 生成一棵赫夫曼树
- C++ Allocator
- IOS开发之NSPredicate 查询、搜索
- sudo不能使用
- 博客今天开通了
- 远离兽性
- Android对Linux内核的改动你知道多少?
- NSBundle--获取文件路径
- 链式存储结构的头指针和头结点