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

    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    typedef struct Tree
    {
        int weight;
        int parent, lchild, rchild;
    }Tree, *HuffmanTree;
    
    void Select(HuffmanTree HT, int i, int &s1, int &s2)
    {//选就小的两个点
        int min = 10000;
        s1 = 1;
        int j,t;
        for ( j = 1; j <= i; j++)//选出第一个
        {
            if (!HT[j].parent&& HT[j].weight < min)//有双亲,就是被选过的不能再次备选
            {
                min = HT[j].weight;
                s1 = j;
                t = j;
            }
        }
        min = 1000;
        for (int j = 1; j <= i; j++)//选出第二个
        {
            if (!HT[j].parent&&j!=t && HT[j].weight < min)
            {
                min = HT[j].weight;
                s2 = j;
            }
        }
    }
    void createHuffmanTree(HuffmanTree &HT, int n)
    {
        int m = n * 2-1;
        HT = new Tree[m+1];
        for (int i = 1; i <= m; i++)
        {
            HT[i].parent = 0;
            HT[i].lchild = 0;
            HT[i].rchild = 0;
        }
        for (int i = 1; i <= n; i++)
        {
            cin >> HT[i].weight;
        }
    //---------------------初始化---------------------
        for (int i = n + 1; i <= m; i++)
        {
            int s1, s2;
            Select(HT, i-1, s1, s2);
            HT[s1].parent = i;
            HT[s2].parent = i;
            HT[i].weight = HT[s1].weight + HT[s2].weight;
            HT[i].lchild = s1;
            HT[i].rchild = s2;
        }
    }
    
    void createHuffmanCode(HuffmanTree &HT, int n)
    {
        char* cd = new char[n];
        cd[n - 1] = '';
        for (int i = 1; i <= n; i++)
        {
            int start = n - 1;
            int c = i;
            int f = HT[i].parent;
            for (; f != 0;)
            {
                --start;
                if (HT[f].lchild == c)cd[start] = '0';
                else cd[start] = '1';
                c = f;
                f = HT[f].parent;
            }
            cout << &cd[start] << endl;
        }
    }
    
    int main()
    {
        HuffmanTree HT;
        createHuffmanTree(HT, 8);
        createHuffmanCode(HT, 8);//这个只能在里面输出,传出去还不会
        for (int i = 1; i <16; i++)
        {
        cout <<i<<"  "<< HT[i].weight << "  " << HT[i].parent << "  " << HT[i].lchild << "  " << HT[i].rchild << endl;
        }//输出数据
        //string a("1234"), b("ds");
        //HC.push_back(a);
        //HC.push_back(b);
        //for (int i = 0; i <8; i++)
        //    cout << HC[i] << endl;
    }
  • 相关阅读:
    Hibernate(九)HQL查询
    Hibernate(八)多对多映射
    Hibernate(七)一对一映射
    Hibernate(六)一对多映射(多对一)
    Hibernate(五)基本数据类型
    Hibernate(四)结构-基础语义和事务
    Hibernate(三)结构-配置文件-实体映射及配置文件
    Hibernate框架简介(二)基本使用增、删、改、查
    Hibernate生成实体类-手工写法(一)
    Java从零开始学四十(反射简述一)
  • 原文地址:https://www.cnblogs.com/vhyc/p/5503185.html
Copyright © 2011-2022 走看看