最优二叉树以及huffman编码
来源:互联网 发布:合肥好的装修公司知乎 编辑:程序博客网 时间:2024/05/16 11:59
这个程序比较容易写,不过可能严格来说,一些高手会觉得比较恶心,因为用了冒泡排序,所以按书上的说法,应该用堆排序,比较效率高!但是还没看到堆排序,就用比较熟悉的冒泡先充着!然后huffman编码也比较好写,主要利用递归就搞掂了,下面是程序(写这个程序本来用template模板写的,但是后来发现如果用模板写,就不可以很好的将头文件与定义文件分开,所以最后就没有用模板,而是用int和char来实现!把声明头文件与定义头文件分开,主要想对这个问题有一些概念的认识)
eg:
How many?
4
(frequence , alpha)
3 d 4 g 12 f 5 h
24 12 5 7 3 4 12
code..h: 00
code..d: 010
code..g: 011
code..f: 1
Press any key to continue
程序1main.cpp
#include"BestBiTree.h"
void main()
{
int size(0);
int x(0);
char ch;
string str;
vector<Node*>data;
cout<<"How many?"<<endl;
cin>>size;
cout<<"(frequence , alpha)"<<endl;
for(int i = 0;i<size;i++)
{
cin>>x>>ch;
Node *p = new Node(x,ch);
data.push_back(p);
}
BestBiTree tree(data);
tree.PrePrint(tree.Root());
cout<<endl;
tree.Code(data,tree.Root(),str);
}
程序2 声明头文件
#include<iostream>
#include<vector>
#include<string>
using namespace std;
class Node;
void Sort(vector<Node*>&data);
class BestBiTree;
class Node
{
friend class BestBiTree;
friend void Sort(vector<Node*>&data);
private:
int item;
char alpha;
Node *left;
Node *right;
public:
inline Node(int x,char ch);
~Node(){}
};
class BestBiTree
{
private:
Node *root;
Node *current;
public:
BestBiTree(vector<Node*>&data);
void PrePrint(Node* cur);
void Delete(Node* cur);
Node* Root();
void Code(vector<Node*>&data,Node *cur,string str);
~BestBiTree();
};
程序3 定义头文件
#include"BestBiTree.h"
inline Node::Node(int x,char ch)
{
item = x;
alpha = ch;
left = NULL;
right = NULL;
}
void Sort(vector<Node*>&data)
{
Node* temp;
for(int i = data.size();i>0;i--)
{
for(int j = 0;j<i-1;j++)
{
if(data[j+1]->item>data[j]->item)
{
temp = data[j];
data[j] = data[j+1];
data[j+1] = temp;
}
}
}
}
BestBiTree::BestBiTree(vector<Node*>&data)
{
int temp0,temp1;
while(data.size()>1)
{
Sort(data);
temp0 = data[data.size()-1]->item;
temp1 = data[data.size()-2]->item;
Node *proot = new Node(temp0+temp1,'*');
proot->left = data[data.size()-1];
proot->right = data[data.size()-2];
data.pop_back();
data.pop_back();
data.push_back(proot);
}
root = data[0];
current = root;
}
void BestBiTree::PrePrint(Node* cur)
{
if(cur != NULL)
{
cout<<cur->item<<" ";
PrePrint(cur->left);
PrePrint(cur->right);
}
}
BestBiTree::~BestBiTree()
{
Delete(root);
}
void BestBiTree::Delete(Node* cur)
{
if(cur != NULL)
{
if((cur->left == NULL)&&(cur->right == NULL))
{
Node *p;
p = cur;
delete p;
}
else
{
Delete(cur->left);
Delete(cur->right);
}
}
}
Node* BestBiTree::Root()
{
current = root;
return current;
}
void BestBiTree::Code(vector<Node*>&data,Node *cur,string str)
{
if((cur->left == NULL)&&(cur->right == NULL))
{
cout<<"code.."<<cur->alpha<<": "<<str<<endl;
}
else
{
str = str+'0';
Code(data,cur->left,str);
str = str.erase(str.size()-1,1);
str = str+'1';
Code(data,cur->right,str);
str = str.erase(str.size()-1,1);
}
}
- 最优二叉树以及huffman编码
- 哈夫曼树(huffman)--最优二叉树的编码实现
- Huffman算法/编码不一定能得出最优二叉树
- 最优二叉树(哈弗曼(Huffman)树)
- 哈夫曼Huffman树(最优二叉树)
- C++实现Huffman最优二叉树
- Huffman算法(最优二叉树)
- 基于二叉树和双向链表实现限制长度的最优Huffman编码
- 基于二叉树和数组实现限制长度的最优Huffman编码
- 构造Huffman树以及对Huffman编码
- 二叉树和Huffman编码
- 最优二叉树&&哈夫曼编码
- 构造最优二叉树-赫夫曼(Huffman)树算法
- poj 3253 Huffman树(最优二叉树)
- Huffman tree(赫夫曼树、霍夫曼树、哈夫曼树、最优二叉树)
- Huffman算法实现最优二叉树(C++)
- Huffman编码(二叉树的应用)
- 实验名称: :Huffman编码(二叉树应用)
- 使用VS自带的混淆器防止你的程序被反编译
- Hyper-Threading Technology
- 用like语句时的C#格式化函数
- !Quick Screen Capture v3.0.0
- 以实例说明如何使用C#从数据库中提取数据,按要求自动生成定制的Excel表格
- 最优二叉树以及huffman编码
- GridView自定义分页导航
- Paragon Drive Backup 8.5 Professional Edition
- GridView控件修改、删除示例(修改含有DropDownList控件)
- Brew常见错误整理
- Kaspersky Anti-Virus 7.0.0.6 Beta
- 尼康F镜头的种类和识别方法
- Gridview][UpdateCommand的写法要点]
- Win32 Thread API学习