Huffman算法_优先队列_new与delete
一个大一新生写的代码。如有高见,望不吝赐教。没有太多时间,只放代码了。
#include <iostream>
#include <queue>
#include <vector>
#include <stdio.h>
#define maxn 222
using namespace std;
struct Tree{
int k=0;
string s;
bool unite=false;
Tree *left=NULL,*right=NULL,*self=NULL;//能够在后续操作中删去new出的内存就把它存到一个位置
};
struct cmp{
bool operator() (const Tree a ,const Tree b) const{
return a.k>b.k;//如果这个是true,表示a的优先级比b小
}
};
priority_queue<Tree,vector<Tree>,cmp> pq;
void get_value();
void creat_Tree();
void get_num(Tree T,string s);
int main()
{
get_value();
creat_Tree();
Tree tem=pq.top();
get_num(tem,"");
delete tem.self;
return 0;
}
void get_value()
{
int sum=0;
cout << "请输入结点数: ";
cin >> sum;
cout << "与相应的字符与对应值\n";
for(int i=0;i<sum;i++){
Tree *p=new Tree;
p->self=p;
cin >> p->s >> p->k;
pq.push(*p);
}
}
void creat_Tree()
{
while(pq.size()!=1){
Tree a=pq.top();pq.pop();
Tree b=pq.top();pq.pop();
Tree *p=new Tree;
p->k=a.k+b.k;
// cout << a.k << "+" << b.k << "=" << p->k << endl;
p->unite=true;
if(a.k==b.k && b.unite) p->left=b.self,p->right=a.self;
else p->left=a.self,p->right=b.self;
p->self=p;
pq.push(*p);
}
}
void get_num(Tree T,string s)
{
if(T.unite==false)
cout << T.s << '\t' << s << endl;
else{
get_num(*T.left,s+"0");
delete T.left;T.left=NULL;//访问完就删
get_num(*T.right,s+"1");
delete T.right;T.right=NULL;
}
}
/*
一 2
第 3
在 5
要 7
共 11
上 13
是 17
中 19
过 23
同 29
和 31
的 37
有 41
*/