c++实现哈夫曼树HuffmanTree

本文提供了一个使用C++实现的霍夫曼树构建过程。通过输入节点权重,程序能够自动创建并显示霍夫曼树的结构。霍夫曼树常用于数据压缩中,通过最小化加权路径长度来优化编码效率。
#include <iostream>
#define INT_MAX 2147483647;
using namespace std;

typedef struct{
    int weight;
    int parent,lchild,rchild;
}HTNode,*HuffmanTree;

void display(HuffmanTree HT,int n);
static int x[3] = {0};
int* Select(HuffmanTree HT,int a,int s1,int s2){

    x[0] = s1;
    x[1] = s2;
    x[2] = -1;
    x[3] = -1;

    for(int i=0;i<a+1;i++){
        if(HT[i].parent != 0) {continue;}
        if(HT[i].weight<x[0]&&HT[i].weight>x[1])
            {
                x[0] = HT[i].weight;x[2] = i;cout<<"赋值给左边";
            }
        else if(HT[i].weight<x[1]&&HT[i].weight>x[0])
            {
                x[1] = HT[i].weight;x[3] = i;cout<<"赋值给右边";
            }
        else if(HT[i].weight<x[0]&&HT[i].weight<x[1])
            {
                if(x[0]<x[1])
                    {
                        x[1] = HT[i].weight;x[3] = i;cout<<"赋值给左边";
                    }
                else
                    {
                        x[0] = HT[i].weight;x[2] = i;cout<<"赋值给右边";
                    }
            }

    }
    cout<<endl<<"weight、parent(id)、lchild(id)、rchild(id)分别是:["<<x[0]<<","<<x[1]<<","<<x[2]<<","<<x[3]<<"]"<<endl;
    return x;
}

void CreatHuffmanTree(HuffmanTree &HT,int n){
    if(n<=1) return ;
    int m = 2*n-1;
    HT = new HTNode[m+1];
    for(int i=0;i<=m;i++){
        HT[i].weight = 0;
        HT[i].parent = 0;
        HT[i].lchild = -1;
        HT[i].rchild = -1;
    }
    for(int i=0;i<n;i++){
        cout<<"Please enter "<<i<<"th"<<" nodes,and end of the enter key"<<endl;
        cin>>HT[i].weight;
    }
/**
* 开始计算
*/
    for(int i=n;i<=m;++i){
        int s1 = INT_MAX;
        int s2 = INT_MAX;
        int index1 = -1;
        int index2 = -1;
        Select(HT,i-1,s1,s2);
        s1 = x[0];
        s2 = x[1];
        index1 = x[2];
        index2 = x[3];
        //cout<<"lchild(value)和rchild(value)的值分别是: "<<s1<<"、"<<s2<<endl;
        HT[index1].parent = i;
        HT[index2].parent = i;
        HT[i].lchild = index1;
        HT[i].rchild = index2;
        HT[i].weight = s1 + s2;
        //display(HT,4);
    }
}

void display(HuffmanTree HT,int n){
    cout<<"_______________"<<endl;
    for(int i=0;i<2*n-1;i++){
        cout<<i<<"="<<"|"<<HT[i].weight<<" "<<HT[i].parent<<" "<<HT[i].lchild<<" "<<HT[i].rchild<<"|";
        cout<<endl;
    }
    cout<<"_______________"<<endl;
}

int main()
{

    HuffmanTree HT;
    int num = 0;
    cout<<"Please enter the node of this tree"<<endl;
    cin>>num;
    CreatHuffmanTree(HT,num);
    display(HT,num);
    return 0;
}


////////////////
最新版本

#include <iostream>
#define INT_MAX 2147483647;
using namespace std;

typedef struct{
    int weight;
    int parent,lchild,rchild;
}HTNode,*HuffmanTree;

void display(HuffmanTree HT,int n);
static int x[3] = {0};
int* Select(HuffmanTree HT,int a,int s1,int s2){

    x[0] = s1;
    x[1] = s2;
    x[2] = -1;
    x[3] = -1;

    for(int i=0;i<a+1;i++){
        if(HT[i].parent != 0) {continue;}
        if(HT[i].weight<x[0]&&HT[i].weight>x[1])
            {
                x[0] = HT[i].weight;x[2] = i;cout<<"赋值给左边";
            }
        else if(HT[i].weight<x[1]&&HT[i].weight>x[0])
            {
                x[1] = HT[i].weight;x[3] = i;cout<<"赋值给右边";
            }
        else if(HT[i].weight<x[0]&&HT[i].weight<x[1])
            {
                if(x[0]<x[1])
                    {
                        x[1] = HT[i].weight;x[3] = i;cout<<"赋值给左边";
                    }
                else
                    {
                        x[0] = HT[i].weight;x[2] = i;cout<<"赋值给右边";
                    }
            }

    }
    cout<<endl<<"weight、parent(id)、lchild(id)、rchild(id)分别是:["<<x[0]<<","<<x[1]<<","<<x[2]<<","<<x[3]<<"]"<<endl;
    return x;
}

void CreatHuffmanTree(HuffmanTree &HT,int n){
    if(n<=1) return ;
    int m = 2*n-1;
    HT = new HTNode[m+1];
    for(int i=0;i<=m;i++){
        HT[i].weight = 0;
        HT[i].parent = 0;
        HT[i].lchild = -1;
        HT[i].rchild = -1;
    }
    for(int i=0;i<n;i++){
        cout<<"Please enter "<<i<<"th"<<" nodes,and end of the enter key"<<endl;
        cin>>HT[i].weight;
    }
/**
* 开始计算
*/
    for(int i=n;i<=m;++i){
        int s1 = INT_MAX;
        int s2 = INT_MAX;
        int index1 = -1;
        int index2 = -1;
        Select(HT,i-1,s1,s2);
        s1 = x[0];
        s2 = x[1];
        index1 = x[2];
        index2 = x[3];
        //cout<<"lchild(value)和rchild(value)的值分别是: "<<s1<<"、"<<s2<<endl;
        HT[index1].parent = i;
        HT[index2].parent = i;
        HT[i].lchild = index1;
        HT[i].rchild = index2;
        HT[i].weight = s1 + s2;
        //display(HT,4);
    }
}

void display(HuffmanTree HT,int n){
    cout<<"_______________"<<endl;
    for(int i=0;i<2*n-1;i++){
        cout<<i<<"="<<"|"<<HT[i].weight<<" "<<HT[i].parent<<" "<<HT[i].lchild<<" "<<HT[i].rchild<<"|";
        cout<<endl;
    }
    cout<<"_______________"<<endl;
}

int main()
{

    HuffmanTree HT;
    int num = 0;
    cout<<"Please enter the node of this tree"<<endl;
    cin>>num;
    CreatHuffmanTree(HT,num);
    display(HT,num);
    return 0;
}

 

转载于:https://my.oschina.net/lafter/blog/901753

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值