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 }

 

你可能感兴趣的:(Huffman)