正文

Huffman树的建立问题2007-03-27 23:58:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/andyhou/24338.html

分享到:

  我今天写了个利用最小堆建立哈夫漫树。在最小堆每个单独的程序我都编译过没有问题了,但是在放在建立huffman树中就出现了,问题。哪位高手帮我解决一下。非常感谢! 一下是程序: 树结点类实现。 //“HuffmanTreeNode.h" #if ! defined(_HUFFMANTREENODE_H)#define _HUFFMANTREENODE_H template<class Elem>class HuffmanTreeNode{ private:  HuffmanTreeNode* left;  HuffmanTreeNode* right;  HuffmanTreeNode* parent;  Elem element; public:  HuffmanTreeNode(Elem elementval,HuffmanTreeNode* leftval=NULL,               HuffmanTreeNode* rightval=NULL,      HuffmanTreeNode* parentval=NULL)  {   element=elementval;   left=leftval;   right=rightval;   parent=parentval;  }  HuffmanTreeNode(HuffmanTreeNode* leftval=NULL,HuffmanTreeNode* rightval=NULL,               HuffmanTreeNode* parentval=NULL)  {   left=leftval;   right=rightval;   parent=parentval;  }  virtual ~HuffmanTreeNode(){}  void setVal(Elem& e)   {   element=e;  }  Elem& getVal()  {   return element;  }  HuffmanTreeNode* getLeft()  {   return left;  }     void setLeft(HuffmanTreeNode* T)  {   left=T;  }  HuffmanTreeNode* getRight()  {   return right;  }  void setRight(HuffmanTreeNode* T)  {   right=T;  }  HuffmanTreeNode* getParent()  {   return parent;  }  void setParent(HuffmanTreeNode* T)  {   parent=T;  }};#endif 最小堆优先队列。   "MinHeap.h" #if ! defined(_MINHEAP_H)#define _MINHEAP_H template<class Elem>class MinHeap{private: Elem* heapArray; int CurrentSize; int MaxSize;public: MinHeap(const int n); virtual~ MinHeap() {  delete []heapArray; } void BuildHeap(); bool isLeaf(int pos) const; int leftChild(int pos) const; int rightChild(int pos) const; //return parent position int parent(int pos) const; //删除给定下标的元素。 bool Remove(int pos,Elem& node); void SiftDown(int left); void SiftUp(int position); bool Insert(const Elem& newNode); Elem& RemoveMin(); bool print() const;};template<class Elem>MinHeap<Elem>::MinHeap(const int n){ if(n<=0)  return ; CurrentSize=0; MaxSize=n; heapArray=new Elem[MaxSize]; BuildHeap();} template<class Elem>void MinHeap<Elem>::BuildHeap(){ for(int i=CurrentSize/2-1;i>=0;i--)  SiftDown(i);} template<class Elem>bool MinHeap<Elem>::isLeaf(int pos) const{ return (pos>=CurrentSize/2) && (pos<CurrentSize);} template<class Elem>int MinHeap<Elem>::leftChild(int pos) const{ return 2*pos+1;} template<class Elem>int MinHeap<Elem>::rightChild(int pos) const{ return 2*pos+2;} template<class Elem>int MinHeap<Elem>::parent(int pos) const{ return (pos-1)/2;}//向下筛选。template<class Elem>void MinHeap<Elem>::SiftDown(int left){ int i=left;                            //标记父结点。 int j=2*i+1; Elem temp=heapArray[i];  while(j<CurrentSize) {  if((j<CurrentSize-1) && (heapArray[j]>heapArray[i]))     j++;                          //指向右子结点     if(temp>heapArray[j])   {    heapArray[i]=heapArray[j];    i=j;    j=2*j+1;   }     else     break;  } heapArray[i]=temp;}//向上筛选template<class Elem>void MinHeap<Elem>::SiftUp(int position){ int temppos=position; Elem temp=heapArray[temppos]; while((temppos>0) && (heapArray[parent(temppos)]>temp)) {  heapArray[temppos]=heapArray[parent(temppos)];  temppos=parent(temppos); } heapArray[temppos]=temp;} template<class Elem>bool MinHeap<Elem>::Insert(const Elem& newNode){ if(CurrentSize==MaxSize)  return false; heapArray[CurrentSize]=newNode; SiftUp(CurrentSize); CurrentSize++; return true;} template<class Elem>Elem& MinHeap<Elem>::RemoveMin(){ if(CurrentSize==0) {    cout<<"Can't Delete "; } else {  Elem temp=heapArray[0];  heapArray[0]=heapArray[CurrentSize-1];  CurrentSize--;  if(CurrentSize>1)   SiftDown(0);  return temp; }}   template<class Elem>bool MinHeap<Elem>::Remove(int pos,Elem& node){ if((pos<0) || (pos>CurrentSize))  return false; Elem temp=heapArray[pos]; heapArray[pos]=heapArray[--CurrentSize]; SiftUp(pos); SiftDown(pos); node=temp; return true;} template<class Elem>bool MinHeap<Elem>::print() const{  if(CurrentSize<0)   return false;  for(int i=0;i<CurrentSize;i++)   cout<<heapArray[i]<<" ";  return true;}#endif Huffman树类实现。 "HuffmanTree.H" #if !defined(_HUFFMANTREE_H)#define _HUFFMANTREE_H template<class Elem>class HuffmanTree{ private:  HuffmanTreeNode<Elem>* root;    void MergeTree(HuffmanTreeNode<Elem> & ht1,               HuffmanTreeNode<Elem> &ht2,      HuffmanTreeNode<Elem>* parent); public:  HuffmanTree(Elem Weiht[],int n);  void DeleteTree(HuffmanTreeNode<Elem>* root);   ~HuffmanTree();  void print(HuffmanTreeNode<Elem>* root) const;  HuffmanTreeNode<Elem>* getRoot()  {   return root;  }}; template<class Elem>void HuffmanTree<Elem>::MergeTree(HuffmanTreeNode<Elem> &ht1,          HuffmanTreeNode<Elem> &ht2,          HuffmanTreeNode<Elem> *parent){ Elem it; parent->setLeft(&ht1); parent->setRight(&ht2); it=ht1.getVal()+ht2.getVal(); parent->setVal(it); parent->setParent(NULL); ht1.setParent(parent); ht2.setParent(parent);} template<class Elem>HuffmanTree<Elem>::HuffmanTree(Elem Weight[],int n){ MinHeap<HuffmanTreeNode<Elem> > heap(n); HuffmanTreeNode<Elem> *parent,firstChild,secondChild; HuffmanTreeNode<Elem>* NodeList=new HuffmanTreeNode<Elem>[n]; for(int i=0;i<n;i++) {  NodeList[i].setVal(Weight[i]);  NodeList[i].setParent(NULL);  NodeList[i].setLeft(NULL);  NodeList[i].setRight(NULL);  heap.Insert(NodeList[i]); }  for(i=0;i<n;i++) {  parent=new HuffmanTreeNode<Elem>;  firstChild=heap.RemoveMin();  secondChild=heap.RemoveMin();  MergeTree(firstChild,secondChild,parent);  heap.Insert(*parent);  root=parent; } delete []NodeList;} template<class Elem>void HuffmanTree<Elem>::DeleteTree(HuffmanTreeNode<Elem>* root){ if(root!=NULL) {  DeleteTree(root->getLeft());  DeleteTree(root->getRight());  delete root; }} template<class Elem> HuffmanTree<Elem>::~HuffmanTree(){ DeleteTree(root);} template<class Elem>void HuffmanTree<Elem>::print(HuffmanTreeNode<Elem>* root) const{ if(root!=NULL) {  print(root->getLeft());  cout<<root->getVal()<<" ";  print(root->getRight()); }}#endif 主程序: "main.cpp" #include <iostream>#include "MinHeap.h"#include "HuffmanTreeNode.h"#include "HuffmanTree.h" using namespace std; int main(){   int ch[20];   for(int i=0;i<20;i++)    ch[i]=i;   HuffmanTree<int> A(ch,20);   A.print(A.getRoot());   return 0;}   请哪位高手帮我在VC6.0中运行看一下哪里出错了,对每个算法是没有错误的。只是当他们连在一起要注意些什么。请高手指点。谢谢。

阅读(2981) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册