- //huffmantree.h
- #ifndef HUFFMANTREE_H
- #define HUFFMANTREE_H
- #include <IOSTREAM>
- #include <STRING>
- #include <MAP>
- typedef struct HuffmanNode* pHuffmanNode;
- struct HuffmanNode
- {
- int data;
- pHuffmanNode left,right;
- };
- class MinHeap
- {
- private:
- pHuffmanNode Data[100];
- int Size;
- int Capacity;
- public:
- MinHeap():Size(0),Capacity(100)
- {
- //Data=new HuffmanNode[Capacity];
- Data[0]=NULL;
- }
- ~MinHeap(){}
- bool Insert(pHuffmanNode);
- pHuffmanNode DeleteMin();
- bool IsFull(){return Size==Capacity-1;}
- bool IsEmpty(){return Size==0;}
- void Print();
- int GetSize(){return Size;}
- };
- bool MinHeap::Insert(pHuffmanNode x)
- {
- if(IsFull())
- return false;
- for(int i=++Size;i>1&&Data[i/2]->data>x->data;i/=2)
- {
- Data[i]=Data[i/2];
- }
- Data[i]=x;
- return true;
- }
- pHuffmanNode MinHeap::DeleteMin()
- {
- /*if(IsEmpty())
- return Type(-1111);*/
- pHuffmanNode temp=Data[1];
- pHuffmanNode last=Data[Size--];
- int parent,child;
- for(parent=1;2*parent<=Size;parent=child)
- {
- child=parent*2;
- if(2*parent+1<=Size&&Data[2*parent]->data>Data[2*parent+1]->data)
- child++;
- if(last->data>Data[child]->data)
- Data[parent]=Data[child];
- else
- break;
- }
- Data[parent]=last;
- return temp;
- }
- void MinHeap::Print()
- {
- for(int i=1;i<=Size;i++)
- {
- std::cout<<Data[i]->data<<" ";
- }
- std::cout<<std::endl;
- }
- class HuffmanTree
- {
- private:
- pHuffmanNode root;
- MinHeap minheap;
- char code[11][10];
- public:
- HuffmanTree():root(NULL){
- for(int i=0;i<11;i++)
- for(int j=0;j<10;j++)
- code[i][j]=' ';
- }
- ~HuffmanTree();
- void ReleaseHuffmanTreeNode(pHuffmanNode);
- pHuffmanNode CreateHuffmanTree(int* a,int length);
- void BuildMinHeap(int*,int);
- void PrintPreOrder();
- void PrintInOrder();
- void PreOrderTraversal(pHuffmanNode);
- void InOrderTraversal(pHuffmanNode);
- void EnCode();
- void DeCode(char*,int);
- void MakeCode(int i,char* temp,pHuffmanNode pNode);
- };
- pHuffmanNode HuffmanTree::CreateHuffmanTree(int* a,int length)
- {
- BuildMinHeap(a,length);
- while(1)
- {
- if(minheap.GetSize()==1)
- return root;
- HuffmanNode* temp1;
- HuffmanNode* temp2;
- temp1=minheap.DeleteMin();
- temp2=minheap.DeleteMin();
- if(!temp2)
- return root;
- HuffmanNode* temp3=new HuffmanNode;
- temp3->data=temp1->data+temp2->data;
- temp3->left=temp1;
- temp3->right=temp2;
- minheap.Insert(temp3);
- root=temp3;
- }
- return root;
- }
- void HuffmanTree::BuildMinHeap(int* a,int length)
- {
- for(int i=0;i<length;i++)
- {
- HuffmanNode* sample=new HuffmanNode;
- sample->data=a[i];
- sample->left=sample->right=NULL;
- minheap.Insert(sample);
- }
- }
- void HuffmanTree::PrintPreOrder()
- {
- PreOrderTraversal(root);
- }
- void HuffmanTree::PreOrderTraversal(pHuffmanNode temp)
- {
- if(!temp)
- return;
- std::cout<<temp->data<<" ";
- PreOrderTraversal(temp->left);
- PreOrderTraversal(temp->right);
- }
- void HuffmanTree::PrintInOrder()
- {
- InOrderTraversal(root);
- }
- void HuffmanTree::InOrderTraversal(pHuffmanNode temp)
- {
- if(!temp)
- return;
- InOrderTraversal(temp->left);
- std::cout<<temp->data<<" ";
- InOrderTraversal(temp->right);
- }
- HuffmanTree::~HuffmanTree()
- {
- ReleaseHuffmanTreeNode(root);
- }
- void HuffmanTree::ReleaseHuffmanTreeNode(pHuffmanNode temp)
- {
- if(!temp)
- return;
- ReleaseHuffmanTreeNode(temp->left);
- ReleaseHuffmanTreeNode(temp->right);
- }
- void HuffmanTree::EnCode()
- {
- char temp[10]={'0'};
- MakeCode(-1,temp,root);
- for(int i=1;i<11;i++)
- {
- std::cout<<i<<": ";
- for(int j=0;j<10;j++)
- {
- std::cout<<code[i][j];
- }
- std::cout<<std::endl;
- }
- }
- void HuffmanTree::MakeCode(int i,char* temp,pHuffmanNode pNode)
- {
- //遍历该哈夫曼树
- if(!pNode->left&&!pNode->right)
- {
- for(int j=0;j<=i;j++)
- code[pNode->data][j]=temp[j];
- return;
- }
- temp[i+1]='0';
- MakeCode(i+1,temp,pNode->left);
- temp[i+1]='1';
- MakeCode(i+1,temp,pNode->right);
- }
- void HuffmanTree::DeCode(char* str,int length)
- {
- int deCodeNum[100]={0};
- int orderOfCode=0;
- for(int i=0;i<length;i++)
- {
- for(int j=1;j<11;j++)
- {
- int k=i;
- int l=0;
- bool bCodeIn=false;
- while(code[j][l]==str[k])
- {
- bCodeIn=true;
- k++;
- l++;
- }
- if(code[j][l]==' '&&bCodeIn)
- {
- //当str中的前k位与code[j]的前k位相同时
- deCodeNum[orderOfCode++]=j;
- i=k-1;
- break;
- }
- }
- }
- for(i=0;i<orderOfCode;i++)
- {
- std::cout<<deCodeNum[i]<<" ";
- }
- std::cout<<std::endl;
- }
- #endif
哈夫曼
最新推荐文章于 2023-07-14 20:17:11 发布