zoukankan      html  css  js  c++  java
  • 哈夫曼树

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

    原因我还在寻找。

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

    首先我是吧他当作一个二叉树来写的。我首先申明一个结点构造的结点函数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);
    }主要用代码解释

    
  • 相关阅读:
    PHP_SELF、 SCRIPT_NAME、 REQUEST_URI 区别
    用canvas画弧形进度条
    sass/scss 和 less的区别
    vue-router 知识点记录
    vue-cli中全局组件的注册使用
    传统项目转前端工程化——路由跳转时出现浏览器锁死和白屏【该死的同步ajax】
    亲身实践 yui-compressor压缩js和css
    vue-webpack 做出来的项目部署到服务器上,点开是空白页(我这里把项目发布到git上)
    git相关
    对象中的方法积累
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/6763408.html
Copyright © 2011-2022 走看看