用連結串列的方式構建哈夫曼樹
#include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; #define MAXSIZE 30
typedef struct node { int data; struct node *lchild, *rchild; struct node *next; }*TreeLink,Link;
TreeLink CreateTree(int n) { TreeLink link = NULL, p = NULL, q = NULL, s = NULL; int i; link = (TreeLink)malloc(sizeof(Link)); link->lchild = link->lchild = link->next = NULL; s= (TreeLink)malloc(sizeof(Link)); cout << "請輸入葉子的權值" << endl; cin >> s->data; s->lchild = s->rchild = s->next = NULL; link->next = s; for (i = 2; i <= n; i++) { s= (TreeLink)malloc(sizeof(Link)); cout << "請輸入葉子的權值" << endl; cin >> s->data; s->lchild = s->rchild = s->next = NULL; q = link; p = q->next; while (p != NULL) { if (s->data < p->data) { s->next = p; q->next = s; break; } else { q = p; p = p->next; } } if (p == NULL) { q->next = s;
} } return link; }
void Print(TreeLink h) { TreeLink p = h->next; while (p != NULL) { cout << "權值為:" <<p->data<<endl; p = p->next; } printf("\n"); }
TreeLink HuffTree(TreeLink link) { TreeLink p = NULL, q = NULL, s = NULL; while (link->next != NULL) { p = link->next; q = p->next; if (q->next != NULL) link->next = q->next; else { link->next = NULL; } s= (TreeLink)malloc(sizeof(Link)); s->data = p->data + q->data; cout << "s->data" << s->data << endl; s->next = NULL; s->lchild = p; s->rchild = q; q = link; p = q->next; while (p != NULL) { if (s->data <= p->data) { q->next = s; s->next = p; break; } else { q = p; p = p->next;
} if (q != NULL && s->data > q->data) { q->next = s; s->next = p; } } } return s; }
void PreOrder(TreeLink head) { if (head) { cout << head->data << endl; PreOrder(head->lchild); PreOrder(head->rchild); } }
int main() { int n; cout << "請輸入結點的個數" << endl; cin >> n; TreeLink head = CreateTree(n),s=NULL; Print(head); cout << "HuffmanTree" << endl; s = HuffTree(head); PreOrder(s); return 0; }