#include<iostream>
#include"heap.h"
using namespace std;
//5.43--242--huffman树的类定义
const int DefaultSize = 20;
template<class T,class E>
struct HuffmanNode{
E data;
HuffmanNode<T, E>* leftChild, * rightChild, * parent;
HuffmanNode():leftChild(NULL),rightChild(NULL),parent(NULL){}
HuffmanNode(E elem, HuffmanNode<T, E>* left = NULL,
HuffmanNode<T, E>* right = NULL, HuffmanNode<T, E>* par = NULL)
:data(elem), leftChild(left), rightChild(right), parent(par) {}
};
template<class T,class E>
class HuffmanTree {
public:
HuffmanTree(E w[], int n);
~HuffmanTree() { deleteTree(root); }
protected:
HuffmanNode<T, E>* root;//huffman树的根
void deleteTree(HuffmanNode<T, E>* t);//删除以t为根的子树
void mergeTree(HuffmanNode<T, E>& htree1, HuffmanNode<T, E>& htree2,
HuffmanNode<T, E>*& parent) {}//合并二叉树
};
//5.44 构造huffman树的算法--243
template<class T,class E>
HuffmanTree<T, E>::HuffmanTree(E w[], int n) {
MinHeap<T, E> minheap;//使用最小堆存放森林
HuffmanNode<T, E>* parent, & first, & second;
HuffmanNode<T, E>* NodeList = new HuffmanNode<T, E>[n];
//n棵树 组成 的森林
//森林各棵树初始化
for (int i = 0;i < n;i++) {
NodeList[i].data = w[i + 1];
NodeLis[i].leftChild = NULL;
NodeLis[i].rightChild = NULL;
NodeLis[i].parent = NULL;
minheap.Insert(NodeList[i]);//插入最小堆中
}
for (int j = 0;j < n - 1;j++) {//做n-1趟循环,形成huffman树
minheap.RemoveMin(first);//选择根的权值 最小的树
minheap.RemoveMin(second);//选择根的权值 次小的树
mergeTree(first, second, parent);//合并
minheap.Insert(*parent);//重新插入到最小堆
root = parent;//建立根结点
}
};
template<class T,class E>
void HuffmanTree<T, E>::mergeTree(HuffmanNode<T, E>& btree1,
HuffmanNode<T, E>& btree2, HuffmanNode<T, E>*& parent) {
parent = new E;
parent->leftChild = &btree1;
parent->rightChild = &btree2;
parent->data.key = btree1.root->data.key + btree2.root->data.key;
btree1.root->parent = btree2.root->parent = parent;
};