#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;
}