zoukankan      html  css  js  c++  java
  • 贪心算法之哈弗曼树

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

    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);
        }
    }
    

    测试结果图:

  • 相关阅读:
    pat 甲级 1065. A+B and C (64bit) (20)
    pat 甲级 1064. Complete Binary Search Tree (30)
    pat 甲级 1010. Radix (25)
    pat 甲级 1009. Product of Polynomials (25)
    pat 甲级 1056. Mice and Rice (25)
    pat 甲级 1078. Hashing (25)
    pat 甲级 1080. Graduate Admission (30)
    pat 甲级 团体天梯 L3-004. 肿瘤诊断
    pat 甲级 1099. Build A Binary Search Tree (30)
    Codeforce 672B. Different is Good
  • 原文地址:https://www.cnblogs.com/fistao/p/3116101.html
Copyright © 2011-2022 走看看