第一部分
#include <stdio.h> #include <stdlib.h> typedef struct BiTree { char data; struct BiTree *lchild; struct BiTree *rchild; }BiTree, *BiNode; BiNode CreatBiTree(BiNode T) { char ch; scanf("%c", &ch); if(ch == ‘#‘) { T = NULL; } else { T = (BiNode)malloc(sizeof(BiTree)); T->data = ch; T->lchild = CreatBiTree(T->lchild); T->rchild = CreatBiTree(T->rchild); } return T; } void PreBiTree(BiNode T) { if(T) { printf("%c", T->data); PreBiTree(T->lchild); PreBiTree(T->rchild); } } BiNode Copy(BiNode T, BiNode P) { if(T == NULL) { return NULL; } else { P = (BiNode)malloc(sizeof(BiTree)); P->data = T->data; P->lchild = Copy(T->lchild, P->lchild); P->rchild = Copy(T->rchild, P->rchild); } return P; } int Depth(BiTree *T) { int m, n; m = n = 0; if(T == NULL) { return 0; } else { m = Depth(T->lchild); n = Depth(T->rchild); if( m > n) { return (m+1); } else { return (n+1); } } } int BNumber(BiNode T) { int m, n; if(T==NULL) { return 0; } else { m = BNumber(T->lchild); n = BNumber(T->rchild); return m+n + 1; } } int LeafCount(BiNode T) { if(T == NULL) { return 0; } if( T->lchild == NULL && T->rchild == NULL) { return 1; } else { return LeafCount(T->lchild) + LeafCount(T->rchild); } } int main() { int m; // ABC##DE#G##F### BiNode T; T = CreatBiTree(T); PreBiTree(T); m = Depth(T); printf("%d\n", m); m = BNumber(T); printf("%d\n", m); m = LeafCount(T); printf("%d\n", m); }
第二部分---(哈夫曼树)
#include <stdio.h> #include <stdlib.h> typedef struct { int weight; int parent, lch, rch; }HTNode, *HuffmanTree; HuffmanTree CreatHTree(HuffmanTree HT) { int n, m, i, min1, min2; printf("请输入初始结点数目:\t"); scanf("%d", &n); if( n < 1) { return NULL; } HT = (HuffmanTree)malloc(sizeof(HTNode)*m+1); m = 2*n - 1; for( i = 1; i <= m; i++) { HT[i].lch = 0; HT[i].parent = 0; HT[i].rch = 0; HT[i].weight = 0; } for( i = 1; i <= n; i++) { scanf("%d", &HT[i].weight); } // 5 29 7 8 14 23 3 11 for( i = n + 1; i <= m; i++ ) { min1 = 1; min2 = 1; search(HT, &min1 ,&min2, i-1); HT[i].weight = HT[min1].weight + HT[min2].weight; HT[min1].parent = i; HT[min2].parent = i; HT[i].lch = min1; HT[i].rch = min2; } for( i = 1; i <= m; i++ ) { printf("%d个的权重为%d\n",i, HT[i].weight); } return HT; } void search(HuffmanTree HT, int *min1, int *min2, int i) { int small1 = 10000000, small2 = 10000000, p1 = 0, p2 = 0, n; for(n = 1; n <= i; n++) { if( HT[n].parent == 0) { if(HT[n].weight < small1) { small2 = small1; small1 = HT[n].weight; p2 = p1; p1 = n; } else if( HT[n].weight < small2) { small2 = HT[n].weight; p2 = n; } } } *min1 = p1; *min2 = p2; } int main() { HuffmanTree HT; HT = CreatHTree(HT); }
第三部分---(哈夫曼树的应用)
#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct { float weight; int parent, lch,rch; char data; char *num; }HTree, *HuffmanTree; HuffmanTree CreatHTree(HuffmanTree HT, int n) { int i, m; m = 2*n-1; HT = (HuffmanTree)malloc(sizeof(HTree)*(m+1)); for( i = 1; i <= m; i++) { HT[i].lch = 0; HT[i].parent = 0; HT[i].rch = 0; HT[i].weight = 0; } printf("请输入各个字母和字母的权重:"); for(i = 1; i <= n; i++) { getchar(); scanf("%c", &HT[i].data); scanf("%f",&HT[i].weight); } for( i = n+1; i <= m; i++) { int min1, min2; search(HT, &min1,&min2, i-1); HT[min1].parent = i; HT[min2].parent = i; HT[i].lch = min1; HT[i].rch = min2; HT[i].weight = HT[min1].weight+HT[min2].weight; } for(i = 1; i <= m; i++) { printf("%f\n", HT[i].weight); } return HT; } void search(HuffmanTree HT, int *min1, int *min2, int i) { int z, k = 0, p, q; float small1 = 1000000, small2 = 1000000; for( z = 1; z <= i; z++) { if( HT[z].parent == 0) { if( HT[z].weight <= small1 ) { small2 = small1; small1 = HT[z].weight; p = q; q = z; } else if(HT[z].weight <= small2) { small2 = HT[z].weight; p = z; } } } *min1 = p; *min2 = q; } void HtreeCode(HuffmanTree HT, int n) { int m, p, start, k; char cd[n]; cd[n-1] = ‘\0‘; for( m = 1; m <= n; m++ ) { start = n-1; k = m; p = HT[k].parent; while( p ) { start--; if( HT[p].lch == k) { cd[start] = ‘1‘; } else { cd[start] = ‘0‘; } k = p; p = HT[p].parent; } HT[m].num = (char *)malloc(sizeof(char)*(n-start)); strcpy(HT[m].num, &cd[start]); } } int main() { HuffmanTree HT; int n, m, i, k,p, q; printf("请输入要添加的个数: "); scanf("%d", &n); if( n < 1) { return NULL; } HT = CreatHTree(HT, n); HtreeCode(HT, n); for(i = 1; i <= n; i++) { printf("%s\n", HT[i].num); } }