给定n个要编码的字符及其权值,请编程构造哈夫曼树。 输入:字符权值序列,即每个字符后是其权值。例如有5个编码字符a,b,c,d,e,权值分别为3,10,1,4,2,输入序列为:a3b10c1d4e2。

#include <iostream>

#include <stdio.h>

#include<stdlib.h>

using namespace std;

class HuffmanTree; //前视定义,否则友元无法定义

class HUffmanNode

{

    friend  class HuffmanTree; //链表结点类的定义

    HUffmanNode *lchild,*rchild,*link;

    int data;

    char ch;

    HUffmanNode (HUffmanNode *ptr = NULL)    {link=ptr;

         lchild=rchild=NULL;

    }

};

class HuffmanTree

{//单链表类的定义

   private:

    HUffmanNode *root; //指向首结点的指针

   public:

    HuffmanTree ()

    {

         root=new HUffmanNode();

    }

    void input(char a[],int n[],int m);

    void inorder(HUffmanNode *t)

    {

         if(t!=NULL)

         {

              inorder(t->lchild);

              if(t->lchild==NULL&&t->rchild==NULL)

                   cout<<t->ch<<“”;

              inorder(t->rchild);

         }

    }

};

void HuffmanTree :: input (char a[],int n[],int m){

     HUffmanNode *p,*t,*s,*q,*pr,*pt;

     int temp,flag=0;

     char tmp;

     t=new HUffmanNode();

     for(int i=0;i<m;i++)

     {

          for(int j=i;j<m;j++)

          {

               if(n[i]<n[j])

               {

                    temp=n[j];

                    n[j]=n[i];

                    n[i]=temp;

                    tmp=a[j];

                    a[j]=a[i];

                    a[i]=tmp;

               }

          }

     }

     int i=0;

     while(i!=m)

     {

          p=new HUffmanNode();

          p->data=n[i];

          p->ch=a[i];

          p->link=root->link;

          root->link=p;

          i++;

     }

     for(int i=0;i<m-1;i++)

     {

          q=root->link;

          t=new HUffmanNode();

          t->data=q->data+q->link->data;

          t->lchild=q;

          t->rchild=q->link;

          flag=0;

          while(q->link!=NULL)

          {

               if(t->data<q->link->data)

               {

                    s=q->link;

                    q->link=t;

                    t->link=s;

                    flag=1;

                    break;

               }

               q=q->link;

          }

          if(flag==0)

          {

               q->link=t;

               t->link==NULL;

          }

          root=root->link->link;

     }

     root=root->link;

     cout<<“中序叶子序列:”;

     inorder(root);

}

int main()

{

     char a[10];

     int n[10];

     char s;

     int m,i=0;

     while(cin>>s>>m)

     {

          a[i]=s;

          n[i]=m;

          i++;

     }

     HuffmanTree tr;

     tr.input(a,n,i);

     return 0;

}

    原文作者:B树
    原文地址: https://blog.csdn.net/qq_39524832/article/details/80767424
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞