#include<bits/stdc++.h>
#define Max 10
using namespace std;
typedef double DataType;
struct HTreeNode
{
DataType data;
HTreeNode* left, * right;
};
class HTree
{
public:
void CreatHTree(DataType*a,int n);
void PreOrder() { PreOrder(root); }//遍历
void bianma() { bianma(root, ""); }//编码
void Wpl() { Wpl(root, 0); }//权值
private:
void bianma(HTreeNode* r, string s);
void PreOrder(HTreeNode *r);
void Wpl(HTreeNode* r, int len);
HTreeNode* root;
};
void HTree::CreatHTree(DataType* a, int n)
{
HTreeNode* b[Max];
for (int i = 0; i < n; i++)
{
b[i] = new HTreeNode;
b[i]->data = a[i];
b[i]->left = NULL;
b[i]->right = NULL;
}
int flag = n;
for (int i = 0; i < n; i++)
{
int k1 = -1, k2;
for (int o = 0; o < n; o++)
{
if (b[o] != NULL && k1 == -1) {k1 = o; continue;}
if (b[o] != NULL) {k2 = o; break;}
}
for (int o = k2; o < n; o++)
{
if (b[o] != NULL) {
if (b[o]->data < b[k1]->data) { k2 = k1; k1 = o;}
else if (b[o]->data < b[k2]->data) k2 = o;
}
}
HTreeNode* t = new HTreeNode;
t->left = b[k1];
t->right = b[k2];
t->data = t->left->data + t->right->data;
b[k1] = t;
b[k2] = NULL;
flag--;
if (flag == 1) {
root = b[k1];
break;
}
}
}
DataType m = 0;
void HTree::bianma(HTreeNode* r, string s)
{
if (!r) return;
if (!r->left && !r->right)
{
cout<<"权值为"<<r->data<<"的编码为" << s << endl;
}
bianma(r->left, s + '0');
bianma(r->right, s + '1');
}
void HTree::PreOrder(HTreeNode* r)
{
if (!r) return;
cout << r->data << " ";
PreOrder(r->left);
PreOrder(r->right);
}
void HTree::Wpl(HTreeNode* r, int len)
{
if (!r)return;
if (!r->left && !r->right) {
cout <<"概率为"<<r->data<<"的权值为" << len * r->data * 100.0 << endl;
m += r->data * len ;
}
Wpl(r->left, len+1);
Wpl(r->right, len+1);
}
int main()
{
DataType a[10];
DataType n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
HTree t;
t.CreatHTree(a, n);
// t.PreOrder();
cout << endl;
t.bianma();
t.Wpl();
cout << endl;
cout << m;
return 0;
}
二叉树(哈夫曼)
最新推荐文章于 2024-10-06 22:20:18 发布