二元最佳前缀码_最优前缀码

#include#include#includetypedefstruct tree *PointTree;

typedef PointTree Tree;void merge(int start,int end, int *array);

Tree createTree(intnumber);

Tree freeTree(Tree T);

Tree addTree(Tree left,Tree right,Tree T);void PrintfHuffman(Tree T, char *array, intnum);void PrintHuffman(Tree T, char *array, int num, intflag);

Tree HUffman(int sum,int *array);structtree{intnumber;

PointTree Left;

PointTree Right;

};void merge(int start,int end, int *array){int middle = (start+end)/2;int sum = end -start+1;inti,k,j;if(start >=end){return;

}else{

merge(start,middle,array);

merge(middle+1,end,array);

}intiArray[sum];

i=start;

j= middle+1;

k= 0;while(i<=middle && j<=end){if(array[i]

iArray[k++] = array[i++];

}else{

iArray[k++] = array[j++];

}

}if(i > middle && j <=end){while(j<=end){

iArray[k++] = array[j++];

}

}else if(j>end && i<=middle){while(i<=middle){

iArray[k++] = array[i++];

}

}

j=start;for(i=0;i

array[j++] =iArray[i];

}return;

}

Tree createTree(intnumber)

{

Tree T;

T= malloc(sizeof(structtree));

T->number =number;

T->Left =NULL;

T->Right =NULL;returnT;

}

Tree freeTree(Tree T)

{if(T ==NULL){returnNULL;

}

T->Right = freeTree(T->Right);

T->Left = freeTree(T->Left);if(T->Right == NULL && T->Left ==NULL){

free(T);returnNULL;

}

}

Tree addTree(Tree left,Tree right,Tree T)

{if(left == NULL || right ==NULL)

{returnNULL;

}

T= malloc(sizeof(structtree));

T->number = left->number + right->number;

T->Left =left;

T->Right =right;returnT;

}void PrintfHuffman(Tree T, char *array, intnum)

{

PrintHuffman(T->Left,array,num,0);

PrintHuffman(T->Right,array,num,1);

}void PrintHuffman(Tree T, char *array, int num, intflag){char Array[40];inti;for(i=0;i

Array[i]=array[i];

}if(flag == 1)

{

Array[num++] = '1';

printf("%c\n",Array[num-1]);

}else{

Array[num++] = '0';

printf("%c\n",Array[num-1]);

}if(T->Left == NULL && T->Right ==NULL)

{

Array[num]= '\0';

printf("%d:%s\n",T->number,Array);

}else{

PrintHuffman(T->Left,Array,num,0);

PrintHuffman(T->Right,Array,num,1);

}

}

Tree HUffman(int sum,int *array){inti;

Tree T;int Flag=0;int sign1 =0,sign2=1;int data[10] = {10,10,20,20,40,60,80,90,30,50};

sum= 10;

Tree tree[10];

merge(0,9,data);for(i=0;i<10;i++){

tree[i]=createTree(data[i]);

printf("%d\n",tree[i]->number);

}while(sign2 < 10){if(Flag == 2)

{if(tree[sign1] -> number <= tree[sign2] -> number &&tree[sign1+1] -> number <= tree[sign2] ->number)

{

T= addTree(tree[sign1],tree[sign1+1],T);

Flag= 1;//freeTree(tree[sign1]);//freeTree(tree[sign1+1]);

tree[0] =T;

sign2--;

}else if(tree[sign1] -> number <= tree[sign1+1] ->number)

{

T=addTree(tree[sign1],tree[sign2],T);//freeTree(tree[sign1]);//freeTree(tree[sign2]);

tree[sign1] =T;

}else{

sign1++;

T=addTree(tree[sign1],tree[sign2],T);//freeTree(tree[sign1]);//freeTree(tree[sign2]);

tree[sign1] =T;

sign1--;

}

}else{if(sign2+1 >= 10){break;

}if(tree[sign2]->number <= tree[sign1] -> number &&tree[sign2+1] -> number <= tree[sign1] ->number){

T= addTree(tree[sign2],tree[sign2+1],T);

Flag= 2;//freeTree(tree[sign2]);//freeTree(tree[sign2+1]);

tree[sign1+1] =T;

sign2++;

}else{

T=addTree(tree[sign1],tree[sign2],T);//freeTree(tree[sign1]);//freeTree(tree[sign2]);

tree[sign1] =T;

}

}

sign2++;

}if(Flag == 2){

T= addTree(tree[sign1],tree[sign1+1],T);//freeTree(tree[sign1]);//freeTree(tree[sign1+1]);

tree[0] =T;

}else{

T=addTree(tree[sign1],tree[sign2],T);//freeTree(tree[sign1]);//freeTree(tree[sign2]);

tree[0] =T;

sign2++;

}char Array[40];

printf("%d\n",tree[0]->Right->number);

PrintfHuffman(tree[0],Array,0);

}voidmain(){intsum;int array[10];

HUffman(sum,array);return;

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值