哈夫曼树

Posted claireyuancy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哈夫曼树相关的知识,希望对你有一定的参考价值。

关于哈夫曼树其基本定义我就在这不多说了。我写的这个哈夫曼树没有太多的功能,就是我们參考书上的一个作业,就俩个功能,一个是表示孩子双亲表示法。,还有就是吧这个最有二叉树给画出来。其它的就没有了。另外在今天我调试的时候发现我的代码还是有非常多欠缺的地方的。比方哦说我的绘图功能中就没有办法完整的输出。而是无法输出最后四个结点。

原因我还在寻找。

以下就哈夫曼树我来谈谈我当时的构思:

首先我是吧他当作一个二叉树来写的。我首先申明一个结点构造的结点函数element,在element中我所有都是用的int 来定义的,由于在哈发满树中我们须要的是每一个节点的权值,所以我们就不须要用到类模板 了,而是直接用int来解决这个类。

然偶就是在这个类中添砖加瓦的事情了。自己想要什么函数,在里面申明解释即可了。

我在构造函数的时候当中有selected和绘图函数比較难搞。

以下#ifndef HFMTREE_H
#define HFMTREE_H
const int Max = 100;
#include"BiTree.h"
#include<iostream>
using namespace std;
struct element
{
 int weight;
 int lchild, rchild, parent;
};
class HfmTree
{
public:
 HfmTree(int size);
 void Creat(int n);
 void SeLect(int k, int &s1, int &s2 ,int z);
 void reset(int size);
 void print(int size);
 void Makeary(int size);
 void printInl(int size, int i);
 void printInr(int size, int i);
 void Build(int size);
private:
 int m1;
 int top = 0;
 element  *root;
 int maxsize;
 int *pz;
 element *root3;
};

void HfmTree::reset(int size)
{
 int m;
 m = 2 * size - 1;
 pz = new int[m];
 int i;
 pz[0] = root[m].weight;
 for (i = 1; i < m; i++)
  pz[i] = 0;
 
}
void HfmTree::Build(int size)
{
 BiTree<int> zxh1(pz, 2 * size - 1, 0);
 cout << zxh1;
}
void HfmTree::printInl(int m, int i)
{
 if (m == -1)return;
 if (m!=-1)
 {
  //pz[i - 1] = root[m].weight;
  pz[2 * i - 1] = root[root[m].lchild].weight;
  pz[2 * i] = root[root[m].rchild].weight;
  m = root[m].lchild;
  printInl(m, 2 * i);
  m = root[m].lchild;
 }
}
void HfmTree::printInr(int m, int i)
{
 if (m == -1)return;
 if (m!=-1)
 {
  //pz[i - 1] = root[m].weight;
  pz[2 * i - 1] = root[root[m].lchild].weight;
  pz[2 * i] = root[root[m].rchild].weight;
  m = root[m].rchild;
  printInr(m, 2*i+1);
  m = root[m].rchild;
 }
}
void HfmTree::Makeary(int size)
{
 int m;
 m = 2 * size - 1;
 pz = new int[m];
 int i;
 for (i = 1; i <= m; i++)
  pz[i] = 0;
  i = 1;
  while (root[m].parent != size-1)
  {
   if (m == -1)break;
   pz[i-1] = root[m].weight;
   i=2*i;
   m = root[m].lchild;
  }
  m = 2 * size - 1; i = 1;
  while (root[m].parent != size-1)
  {
   if (m == -1)break;
   pz[i-1] = root[m].weight;
   i = 2 * i + 1;
   m = root[m].rchild;
  }
  BiTree<int> zxh1(pz, 2*size+1, 0);
  cout << zxh1;
}
void HfmTree::SeLect(int k, int &s1, int &s2 ,int z)
{
 int w1, w2, i = 1,j;
 w1 = w2 = Max;
 //s1 = s2 = i;
 for (i = 1; i <= k; i++)
 {
  //if (i == s1 || i == s2)continue;
  if (root[i].parent==-1)
  {
   if (root[i].weight < w1)
   {
    w2 = w1;
    w1 = root[i].weight;
    s2 = s1;
    s1 = i;                                  //w1,s1是相应的,且他们的weight是较小者
   }
   else if (root[i].weight < w2)
   {
    w2 = root[i].weight;
    s2 = i;
   }
  }
 }
}
void HfmTree::Creat(int n)
{
 int *w1;
 int i,m,*w,s1,s2; element *p;
 if (n < 1)throw"构建有误!

";
 w = new int[2 * n - 1];
 w1 = new int[2 * n - 1];
 m = 2 * n - 1;                            //n个结点过程中有2*n-1个结点
 m1 = m;
 root = new element[m + 1];
 for (i =1; i <= 2 * n - 1; i++)
 {
  //root[i].weight = NULL;
  root[i].lchild = -1;
  root[i].rchild = -1;
  root[i].parent = -1;
 }
 for (p = root + 1, i = 1; i <= n; i++, p++)
 {
  cout << "请输入全职:" << endl;
  cin >> w[i];
  p->weight = w[i];
  p->lchild = -1;
  p->rchild = -1;
  p->parent = -1;
 }
 for (i = n+1 ; i <= m; i++, p++)
 {
  p->weight = NULL;
  p->lchild = -1;
  p->rchild = -1;
  p->parent = -1;
 }
 for (i = n+1 ; i <= m; i++)
 {
  SeLect(i-1 , s1, s2,m);
  root[s1].parent = i-1;
  root[s2].parent = i-1;
  root[i].weight = root[s1].weight + root[s2].weight;
  root[i].lchild = s1;
  root[i].rchild = s2;
 }
 for (int i = 1; i <= n; i++)
 {
  w1[i-1] = w[n - i + 1];
 }
}

HfmTree::HfmTree(int size)
{
 Creat(size);
}
void HfmTree::print(int size)
{
 int m, i;
 m = 2 * size - 1;//树结点总个数。
 cout << "构建的哈夫曼树为" << endl;
 cout << "no" <<"  "<< "weight" <<"  "<<"Parent"<<"  "<< "lchild" <<"  "<< "rchild" << endl;
 for (i = 1; i <= m; i++){
  cout << i <<"    "<< root[i].weight <<"     "<<root[i].parent<<"       "<< root[i].lchild <<"      "<< root[i].rchild << endl;
 }
}
#endif
——————————————————————————————————————————————————————————————————————
#include"HfmTree.h"
//#include"BiTree.h"
#include<iostream>
using namespace std;
void main()
{
 int num;
 cout << "请输入您想构造的哈夫曼树的结点个数(num):"; cin >> num;
 HfmTree zxh(num);
 zxh.print(num);
 //zxh.Makeary(num);
 zxh.reset(num);
 zxh.printInl(2*num-1,1);
 zxh.printInr(2*num-1, 1);
 zxh.Build(num);
}主要用代码解释

??

以上是关于哈夫曼树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构—— 树:哈夫曼树和哈夫曼编码

哈夫曼树

哈夫曼树中的“权值”是指啥?

哈夫曼树+哈夫曼编码

数据结构中哈夫曼树的应用(C语言)

如何构造哈夫曼树