哈夫曼树之线性表示

//哈夫曼树
//线性表示

#include<iostream>
#include<string.h>
using namespace std;
#define MAXBIT 100
#define MAXVALUE 10000
#define MAXLEAF 30
#define MAXNODE MAXLEAF*2-1

typedef struct
{
    int bit[MAXBIT];
    int start;
}HCodeType;

typedef struct
{
    int weight;
    int parent;
    int lchild;
    int rchild;
    char value;
}HNodeType;


void HuffmanTree(HNodeType HuffNode[], int n)
{
    int i, j, m1, m2, x1, x2;
    for (i = 0; i < 2 * n - 1; i++)
    {
        HuffNode[i].weight = 0;
        HuffNode[i].parent = -1;
        HuffNode[i].lchild = -1;
        HuffNode[i].rchild = -1;
        HuffNode[i].value = i;
    }
    for (i = 0; i < n; i++)
    {
        cout << "请输入第" << i + 1 << "个结点的权值" << endl;
        cin >> HuffNode[i].weight;
        cout << "请输入第" << i + 1 << "个结点的值" << endl;
        cin >> HuffNode[i].value;
    }
    for (i = n; i < 2 * n - 1; i++)
    {
        HuffNode[i].value = 48;
        HuffNode[i].parent = -1;
        HuffNode[i].lchild = -1;
        HuffNode[i].rchild = -1;
        HuffNode[i].weight = 0;
    }
    for (i = 0; i < n - 1; i++)
    {
        m1 = m2 = MAXVALUE;
        x1 = x2 = 0;
        for (j = 0; j < n + i; j++)
        {
            if (HuffNode[j].weight < m1 && HuffNode[j].parent == -1)
            {
                m2 = m1;
                x2 = x1;
                m1 = HuffNode[j].weight;
                x1 = j;
            }
            else if (HuffNode[j].weight < m2 && HuffNode[j].parent == -1)
            {
                m2 = HuffNode[j].weight;
                x2 = j;
            }
        }
            HuffNode[x1].parent = n + i;
            HuffNode[x2].parent = n + i;
            HuffNode[n + i].weight = HuffNode[x1].weight + HuffNode[x2].weight;
            HuffNode[n + i].lchild = x1;
            HuffNode[n + i].rchild = x2;
            cout << "x1.weight :" << HuffNode[x1].weight << "+ x2.weight " << HuffNode[x2].weight << "=" << HuffNode[n + i].weight << endl;
            cout << "它的左子树为" << HuffNode[n + i].lchild << "的值为:" << HuffNode[HuffNode[n + i].lchild].value;
            cout << "它的右子树为" << HuffNode[n + i].rchild << "的值为:" << HuffNode[HuffNode[n + i].rchild].value;
            HuffNode[x1].weight = MAXVALUE;
            HuffNode[x2].weight = MAXVALUE;
        
    }

}

void decodeing(char string[], HNodeType Buf[], int n)
{
    int tmp = 0;
    int i = 0;
    int ptr = 2*n-2;
    while (string[i] != '\n')
    {
        if (string[i] - 48== 0 && Buf[ptr].lchild!=-1)
        {
            ptr = Buf[ptr].lchild;
        }
        else 
        {
            if(string[i] - 48 == 1 && Buf[ptr].rchild != -1)
                ptr = Buf[ptr].rchild;
        }
        i++;
    }
    cout << "解码的值为:" << Buf[ptr].value;
}

int main()
{
    HNodeType HuffNode[MAXNODE];
    int n;
    cout << "请输入结点的个数" << endl;
    cin >> n;
    HuffmanTree(HuffNode, n);
    char string[255];
    for (int i = 0; i < 3; i++)
    {

        cout << "请输入编码" << endl;
        cin >> string;
        decodeing(string, HuffNode, n);
    }
    return 0;
}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值