huffman 树

 1 #include <stdio.h>
 2 #define n 4
 3 typedef struct  
 4 {
 5     int parent;
 6     int lchild,rchild;
 7     int weight;
 8     int flag;
 9 }Node;
10 
11 typedef struct 
12 {
13     char bit[n];
14     int start;
15     char ch;
16 }CodeNode;
17 
18 Node haffman[7];
19 CodeNode code[n];
20 
21 int select(int j)
22 {
23     int i,position;
24     int Min=100;
25     for (i=0;i<=j;i++)
26         if (haffman[i].weight<Min && haffman[i].flag==-1)
27         {
28             Min=haffman[i].weight;
29             position=i;
30         }
31     haffman[position].flag=1;
32     return position;
33 }
34 
35 void haffmanCode()
36 {
37     int i,j,p,k;
38     
39     for (i=0;i<n;i++)
40     {
41         printf("%d ",haffman[i].weight);
42         code[i].start=n-1;
43         j=i;
44         p=haffman[i].parent;
45         while (p!=-1)
46         {
47             if (haffman[p].lchild==j)
48                 code[i].bit[code[i].start]='0';   //左0右1;
49             else
50                 code[i].bit[code[i].start]='1';
51             code[i].start--;
52             j=p;
53             p=haffman[p].parent;
54         }
55         for(k=code[i].start+1 ;k<n ;k++)
56           printf("%c",code[i].bit[k]);
57         printf("\n");
58     }
59 
60 }
61 
62 int main()
63 {
64     
65     int max=100 , i ;
66     int m1,m2;
67 
68     //初始化节点数据;
69     for (i=0;i<2*n-1;i++)
70     {
71         haffman[i].weight=0;
72         haffman[i].parent=-1;
73         haffman[i].lchild=-1;
74         haffman[i].rchild=-1;
75         haffman[i].flag=-1;
76     }
77     printf("请输入叶子节点的权值:");
78     for (i=0;i<n;i++)
79     {
80         scanf("%d",&haffman[i].weight);   
81     }
82     //构造哈弗曼二叉树(n-1次合并);
83     for (i=n ; i<2*n-1 ;i++)
84     {
85         m1=select(i-1);        //最小权值位;
86         m2=select(i-1);     //次最小权值;
87         haffman[m1].parent=i;
88         haffman[m2].parent=i;  //父节点在数组中的位置;
89         haffman[i].weight=haffman[m1].weight+haffman[m2].weight;
90         haffman[i].lchild=m1;
91         haffman[i].rchild=m2;    //儿子节点在数组中的位置;
92         
93     }
94     for (i=0 ;i<2*n-1 ;i++)
95         printf("%d",haffman[i].weight);
96     printf("\n");
97     haffmanCode();
98 }

 

posted @ 2013-05-01 22:48  萧凡客  阅读(241)  评论(0编辑  收藏  举报