Evening all working on a C++ implementation of huffman coding, Here s what I have. Which oddly is working most of the time. But with certain input I am getting incorrect coding/output. Please let me know if you see what im missing here...Ill keep looking.. Thanks for your help ! Updated code to fix problems mentioned below...still getting the same problem.
#include <iostream> 
#include <queue> 
#include <list> 
#include <iterator>
#include <vector>
#include <algorithm>
class HuffmanCodes
{
struct Node
{
int data;
size_t freq;
Node* left;
Node* right;
Node()
{
   data = '\0';
   freq = 0;
}
Node(int data, size_t freq) : data(data),
                                freq(freq),
                                left(nullptr),
                                right(nullptr)
                                {}
~Node()
{
  delete left;
  delete right;
}
};
struct compare
{
 bool operator()(Node* l, Node* r)
{
   return (l->freq > r->freq);
}
};
Node* top;
void printCode(Node* root, std::string str, std::vector<int>& data, int i)
{
if(root == nullptr)
 return;
if(root->data != '$' && data[i] == root->data )
{
 std::cout << root->data +1 << " : " << str << "\n";
}
printCode(root->left, str + "0" ,data, i);
printCode(root->right, str + "1", data, i);
}
public:
  HuffmanCodes() {}
   ~HuffmanCodes()
 {
   delete top;
 }
 void GenerateCode( std::vector<int>& data, std::vector<size_t>& freq)
 {
  Node* left;
  Node* right;
  std::priority_queue<Node*, std::vector<Node*>, compare > minHeap;
  for(size_t i = 0; i < data.size(); ++i)
  {
     minHeap.push(new Node(data[i], freq[i]));
  }
   while(minHeap.size() != 1)
   {
     std::sort (data.begin(), data.end());
     left = minHeap.top();
     minHeap.pop();
     right = minHeap.top();
     minHeap.pop();
     top = new Node('$', left->freq + right->freq);
     top->left  = left;
     top->right = right;
     minHeap.push(top);
    }
    for( int j = 0; j < data.size(); j++ )
        printCode(minHeap.top(), "", data, j);
 }
};
int main()
{
   int n;
   std::cin >> n;
   std::vector<int> data;
   std::vector<size_t> freq;
   for(int i = 0; i < n; i++){
        int input;
        std::cin >> input;
        freq.push_back(input);
   }
   for(int i = 0; i < n; i++){
       data.push_back(i);
   }
  HuffmanCodes set1;
  size_t size = n;
  set1.GenerateCode(data, freq);
  return 0;
 }
Input: 20 84 87 78 16 94 36 87 93 50 22 63 28 91 60 64 27 41 27 73 37
Output:
1010
1100
1001
100010
000
01101
1011
1111
11101
100011
0100
01100
1101
0011
0101
00100
11100
00101
0111
10000
Correct output: 1010
1011 
1001
100010
000
01011
1100
1111
11101
100011
0100
01010 
1101
0011
0110
00100
11100
00101
0111
10000
 
    