优先队列实现 哈夫曼编码


用到了优先队列的知识点,还有dfs算法。
优先队列主要是为了查找最小权重树的时候方便查找,不用耗费很多的时间从已经产生的树种依次查找,
具体实现看代码。
dfs主要是用来遍历树从而拿到每个字符的编码,具体实现看代码

#include
#include
#include
#include
using namespace std;
//节点树模型
struct Node{
    char c;
    int weight;
    int parentNode;
    int leftrChild;
    int rightChild;
    friend bool operator< (Node n1, Node n2)
    {
        return n2.weight < n1.weight;
    }
}node[200],tnode;
bool cmp(const Node &p,const Node& q)
{
    return p.weight<=q.weight;
}
void dfs(int n,string str)
{
    if(node[n].c<='z'&&node[n].c>='a')
    {
        cout<>n;
    cout<<"下面分别输入N个字符的权重,权值不会超过10000,(此值可以修改)"<que;
    //初始化每个节点数并加入到优先队列中
    for(int i=1;i<=2*n+1;++i)
    {
        node[i].weight=10000;
        node[i].leftrChild=0;
        node[i].rightChild=0;
        node[i].parentNode=0;
        node[i].c='1';
    }
    for(int i=1;i<=n;++i)
    {
        int temp;
        cin>>temp;
        node[i].weight=temp;//给权重赋值
        char t=(i-1)+'a';
        node[i].c=t;//赋上字符
        node[i].parentNode=0;
        node[i].leftrChild=0;//渣渣用两节课的时间才写出来,请勿抄袭,仅供参考,
        node[i].rightChild=0;
        que.push(node[i]);
    }
    //此时优先队列中的节点数已经按权值由小到大的顺序排好序。
    sort(node+1,node+1+n,cmp);

    for(int j=n+1;j<=2*n-1;++j)
    {
        int weizhi1=0;
        int weizhi2=0;
        int weight1,weight2;
        weight1=que.top().weight;
        que.pop();
        weight2=que.top().weight;
        que.pop();
        for(int i=1;i<=j;++i)
        {
            if(node[i].parentNode==0)
            {
                //查找两个最小节点树,litter1最小,litter2次之.
                if((!weizhi1)&&node[i].weight==weight1)
                {
                    weizhi1=i;
                }
                if((!weizhi2)&&node[i].weight==weight2)
                {
                    weizhi2=i;
                }
            }
        }
        node[weizhi1].parentNode=j;
        node[weizhi2].parentNode=j;
        node[j].leftrChild=weizhi1;
        node[j].rightChild=weizhi2;
        node[j].weight=node[weizhi1].weight+node[weizhi2].weight;
        que.push(node[j]);
    }
    //此时树已经建立完成

    //cout<


你可能感兴趣的:(算法)