Huffman算法-二叉树的应用
假设有一组实数,现在要构造一颗以Wi为权的m个外部结点的扩充二叉树,使得带权的外部路径长度WPL最小。满足这一要求的扩充二叉树就称为Huffman数或最优二叉树。
声明:
#include<stdio.h> #include<malloc.h> typedef struct node{ int data; struct node *lchild,*rchild,*next; }hufnode; typedef hufnode *linkhuf;
/****************************************************/ /* huffman树 */ /****************************************************/ linkhuf Creat_Node(int n) //创建一单链表 { linkhuf head,pre,p; int x; head=NULL; printf("请按从小到大排列。\n"); while(n--) { printf("请输入权值:"); scanf("%d",&x); p=(linkhuf)malloc(sizeof(hufnode)); p->data=x; p->lchild=NULL; p->rchild=NULL; if(NULL==head) { head=p; pre=head; } else { p->next=pre->next; pre->next=p; pre=pre->next; } } pre->next=NULL; printf("已经完成链表的创建。"); return head; }
linkhuf insert(linkhuf root , linkhuf s)//将结点S插入到有序Huffman root中。 { linkhuf p1,p2; if(NULL == root ) root=s; else { p1=NULL; p2=root; while(p2&&p2->data<s->data) { p1=p2; p2=p2->next; } s->next=p2; if(NULL==p1) { root=s; } else { p1->next=s; } } return root; }
void Preorder1(linkhuf t) { if(t!=NULL) { printf("%-6d",t->data); Preorder1(t->lchild); Preorder1(t->rchild); } }
void creathuffman(linkhuf *root)//构造Huffman树。 { linkhuf s, rl,rr; while((*root && (*root)->next)!=NULL) { rl=*root; rr=(*root)->next; if (rr!=NULL) { *root=rr->next; } s=(linkhuf)malloc(sizeof(hufnode)); s->next=NULL; s->data=rl->data+rr->data; s->lchild=rl; s->rchild=rr; rl->next=rr->next=NULL; *root=insert(*root,s); } }
测试:
int main() { linkhuf root; int n; printf("请输入链表结点:\n"); scanf("%d",&n); root=Creat_Node(n); creathuffman(&root); Preorder1(root); printf("\n"); return 0; }
结果:

浙公网安备 33010602011771号