贪心算法之哈弗曼树

参考网上代码,其中实现哈弗曼树的地方,使用了贪心准则。

template<typename Type>class BinaryTree;

template<typename Type>void Huffman(Type *,int,BinaryTree<Type> &);

template<typename Type>class BinTreeNode
{
public:
	friend class BinaryTree<Type>;
	friend void Huffman<Type>(Type *,int,BinaryTree<Type> &);
	BinTreeNode():m_pleft(NULL),m_pright(NULL){}
	BinTreeNode(Type item,BinTreeNode<Type> *left=NULL,BinTreeNode<Type> *right=NULL)
		:m_data(item),m_pleft(left),m_pright(right){}
	void Destroy(){		//destroy the tree with the root of the node
		if(this!=NULL)
		{
			this->m_pleft->Destroy();
			this->m_pright->Destroy();
			delete this;
		}
	}
	Type GetData()
	{
		return m_data;
	}
	BinTreeNode<Type> *Copy(const BinTreeNode<Type> *copy);	//copy the node
private:
	BinTreeNode<Type> *m_pleft,*m_pright;
	Type m_data;
};

template<typename Type>BinTreeNode<Type>* BinTreeNode<Type>::Copy(const BinTreeNode<Type> *copy)
{
	if(copy==NULL)
	{
		return NULL;
	}
	BinTreeNode<Type> *temp=new BinTreeNode<Type>(copy->m_data);
	temp->m_pleft=Copy(copy->m_pleft);
	temp->m_pright=Copy(copy->m_pright);
	return temp;
}
#include "BinTreeNode.h"

template<typename Type>void Huffman(Type *,int,BinaryTree<Type> &);

template<typename Type>class BinaryTree
{
public:
	BinaryTree(BinaryTree<Type> &bt1,BinaryTree<Type> &bt2)
	{
		m_proot=new BinTreeNode<Type>(bt1.m_proot->m_data+bt2.m_proot->m_data,bt1.m_proot,bt2.m_proot);
	}
	BinaryTree(Type item)
	{
		m_proot=new BinTreeNode<Type>(item);
	}
	BinaryTree(const BinaryTree<Type> &copy)
	{
		this->m_proot=copy.m_proot;
	}
	BinaryTree()
	{
		m_proot=NULL;
	}
	void Destroy()
	{
		m_proot->Destroy();
	}
	~BinaryTree()
	{
	}
	BinaryTree<Type>& operator=(BinaryTree<Type> copy);
	friend void Huffman<Type>(Type *,int,BinaryTree<Type> &);
	friend bool operator < <Type>(BinaryTree<Type> &l, BinaryTree<Type> & r);
    friend bool operator > <Type>(BinaryTree<Type> &l, BinaryTree<Type> & r);
    friend bool operator <= <Type>(BinaryTree<Type> &l, BinaryTree<Type> & r);
    friend ostream& operator<< <Type>(ostream& ,BinaryTree<Type>&);	//output the data

private:
	BinTreeNode<Type> *m_proot;
	void Print(BinTreeNode<Type> *start,int n=0);	//print the tree with the root of start
};
template<typename Type> bool operator <(BinaryTree<Type> &l, BinaryTree<Type> &r){
    return l.m_proot->GetData() < r.m_proot->GetData();
}

template<typename Type> bool operator >(BinaryTree<Type> &l, BinaryTree<Type> &r){
    return l.m_proot->GetData() > r.m_proot->GetData();
}

template<typename Type> bool operator <=(BinaryTree<Type> &l, BinaryTree<Type> &r){
    return l.m_proot->GetData() <= r.m_proot->GetData();
}


template<typename Type> void BinaryTree<Type>::Print(BinTreeNode<Type> *start, int n){
	if(start==NULL){
		for(int i=0;i<n;i++){
			cout<<"     ";
		}
		cout<<"NULL"<<endl;
		return;
	}
	Print(start->m_pright,n+1);	//print the right subtree
	for(int i=0;i<n;i++){	//print blanks with the height of the node
		cout<<"     ";
	}
	if(n>=0){
		cout<<start->m_data<<"--->"<<endl;//print the node
	}
	Print(start->m_pleft,n+1);	//print the left subtree
}

template<typename Type> ostream& operator<<(ostream& os,BinaryTree<Type>& out){
	out.Print(out.m_proot);
	return os;
}

template<typename Type> BinaryTree<Type>& BinaryTree<Type>::operator=(BinaryTree<Type> copy){
	m_proot=m_proot->Copy(copy.m_proot);
    return *this;
}
#include "BinaryTree.h"
#include "MinHeap.h"

template<typename Type> void Huffman(Type *elements, int n, BinaryTree<Type> &tree){
    BinaryTree<Type> first, second;
    BinaryTree<Type> node[20];
    for (int i=0; i<n; i++){
        node[i].m_proot = new BinTreeNode<Type>(elements[i]);
    }
    MinHeap<BinaryTree<Type> > heap(node, n);

    for (int i=0; i<n-1; i++){
        heap.DeleteMin(first);
        heap.DeleteMin(second);
        
        //using the first and the second minimize element create new tree
        if (first.m_proot->GetData() == second.m_proot->GetData()){
            tree = *(new BinaryTree<Type>(second, first));
        }
        else {
            tree = *(new BinaryTree<Type>(first, second));
        }

        heap.Insert(tree);
    }
}

测试结果图:

posted @ 2013-06-03 21:22  李VS超  阅读(274)  评论(0编辑  收藏  举报