构造哈弗曼树

来源:互联网 发布:linux系统查看ip地址 编辑:程序博客网 时间:2024/05/21 15:06
#include<iostream>using namespace std;struct HTreeNode{int weight;HTreeNode* parent;HTreeNode* lchild;HTreeNode* rchild;};HTreeNode* CreatHuffmanTree(int *w, int n){int m = 2 * n - 1;HTreeNode* HT = new HTreeNode[m];for (int i = 0; i < n; ++i){HT[i].weight = w[i]; HT[i].parent = HT[i].lchild = HT[i].rchild = NULL;}for (int i = n; i < m; ++i){HT[i].weight = 0; HT[i].parent = HT[i].lchild = HT[i].rchild = NULL;}int m1 = -1, m2;for (int i = n; i < m; ++i){int m1 = -1, m2;for (int j = 0; j < i; ++j){if (!HT[j].parent&&m1 == -1){ m1 = j; continue; }if (!HT[j].parent){ m2 = j; break; }}for (int j = m2; j < i; ++j){if (!HT[j].parent){if (HT[j].weight < HT[m1].weight){ m2 = m1; m1 = j; }else if (HT[j].weight < HT[m2].weight)m2 = j;}}HT[i].weight = HT[m1].weight + HT[m2].weight;HT[i].lchild = &HT[m1]; HT[i].rchild = &HT[m2];HT[m1].parent = &HT[i]; HT[m2].parent = &HT[i];}return &HT[m - 1];}void PreOrderTraverse(HTreeNode* T){if (T){cout << T->weight << " ";PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);}}void main(){int w[] = { 7, 5, 2, 4 };HTreeNode* HT = CreatHuffmanTree(w, sizeof(w) / sizeof(int));PreOrderTraverse(HT);}

0 0