哈夫曼树哈夫曼编码(先序遍历方法)

#include <stdio.h>
#include <stdlib.h>
typedef struct Tree
{
int weight;
int left;
int right;
int parent;
电网技术
}*tree;
void CreateHuffman(int n)
{
int i;
int m1,m2,x1,x2;
tree Huffman[100];
for(i=0;i< 2*n-1;i++)
{
Huffman[i] = (tree) malloc(sizeof(struct Tree));
}
for(i=0;i<n;i++)
{
scanf("%d",&Huffman[i]->weight);
}
for(i=0;i<2*n-1;i++)
{
Huffman[i]->parent = -1;
Huffman[i]->left = -1;
Huffman[i]->right = -1;
}
int j;
for(i=0;i<n-1;i++)
{
m1= m2= 65536;
x1 =x2 = 0;
for(j=0;j<n+i;j++)
{
if( Huffman[j]->weight < m1 && Huffman[j]->parent == -1)
{
m1 = Huffman[j]->weight ;
x1 = j;
}宝泉岭公安局
}复活战士
for(j=0;j<n+i;j++)
{
if( Huffman[j]->weight < m2 && Huffman[j]->parent == -1 && x1 != j)
{
m2 = Huffman[j]->weight ;
x2 = j;
}
}
Huffman[x1]->parent = n+i; Huffman[x2]->parent = n+i;
Huffman[n+i]->weight =Huffman[x1]->weight + Huffman[x2]->weight ;
Huffman[n+i]->left =x1; Huffman[n+i]->right =x2;
}
for(i=0;i<2*n-1;i++)
{
printf("%d,", Huffman[i]->weight);雅芳贿赂门
}
printf("\n");
威海市城里中学for(i=0;i<2*n-1;i++)
{
printf("%d的左结点的下标为%d,右结点的下标为%d\n",Huffman[i]->weight,Huffman[i]->left,Huffman[i]->right);
}
char s[100]; int x; i--; x = i; int k; k=0;
int rs[100];int ls[100]; i=1; tree q[100];
int sum=0;
for(j=0; j<100 ;j++)
{
rs[j] =0;ls[j] =0; s[j]='\0';
}
while( i != 0)
{
if(i==1 && k==0 )
{
q[i] = Huffman[x];
s[i-1] = '*';
k++;
}
while(q[i]->left !=-1 && ls[i] == 0)
{
x =Huffman[x]->left;
ls[i] = 1; i++; k++;
q[i] = Huffman[x];
s[i-1] ='0';
通感ls[i] =0; rs[i] = 0;
}
if(( q[i]->left ==-1&& q[i]->right != -1 && rs[i] ==0 ) || (ls[i] ==1 && q[i]->right != -1&& rs[i] ==0 ) )
{
x =Huffman[x]->right;
rs[i] =1; i++; k++;
q[i] = Huffman[x];
s[i-1] ='1';
ls[i] =0; rs[i] = 0;
}
if( (q[i]->left ==-1 && q[i]->right ==-1 ) )
{
printf("%d:",q[i]->weight);
for( j =1 ; j <i;j++)
printf("%c",s[j]);
printf("\n"); sum+= q[i]->weight *(i-1);
}
if( (q[i]->left ==-1 && rs[i] == 1 ) ||(q[i]->left ==-1 && q[i]->right == -1)
||(q[i]->right ==-1 && ls[i] == 1 ) ||( rs[i] ==1&& ls[i] == 1 ) )
{
i--; k++;
Huffman[x] =q[i];
}
}
printf("带权长度为%d\n",sum);
}
void main()
{
int num; printf("输入叶子结点个数:");scanf("%d",&num);
CreateHuffman( num);
printf("\n");
}

本文发布于:2024-09-23 09:21:20,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/238317.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结点   电网   战士   威海市   长度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议