#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
#include <cstring>
using namespace std;
struct Node
{
char data;
unsigned freq;
Node *left, *right;
Node(char data=' ', unsigned freq=0)
{
left = right = NULL;
this->data = data;
this->freq = freq;
}
bool operator<(Node x)
{
return freq < x.freq;
}
bool operator>(Node x)
{
return freq > x.freq;
}
};
void print_node(Node x)
{
printf("%c: %d\n",x.data,x.freq);
if(x.left)
printf("left:: %c: %d\n",x.left->data,x.left->freq);
if(x.right)
printf("right:: %c: %d\n",x.right->data,x.right->freq);
cout<<endl;
}
void swap(Node *x,Node *y)
{
//printf("xf: %d xd: %c yf: %d % yd: %c\n",x->freq,x->data,y->freq,y->data);
int temp = x->freq;
x->freq = y->freq;
y->freq = temp;
char t = x->data;
x->data = y->data;
y->data = t;
}
void min_heapify(Node *A, int n, int i)
{
int l = 2*(i+1)-1; int r = 2*(i+1);
int smallest;
if (l < n && A[l] < A[i])
smallest = l;
else
smallest = i;
if (r < n && A[r] < A[smallest])
smallest = r;
if (smallest != i)
{
swap(&A[i],&A[smallest]);
min_heapify(A,n,smallest);
}
}
void build_min_heap(Node *A, int n)
{
for(int i = n/2-1; i >= 0; i--)
{
min_heapify(A,n,i);
}
}
Node extract_min(Node *A, int &n)
{
Node min = A[0];
A[0] = A[n-1];
n--;
min_heapify(A,n,0);
return min;
}
void insert(Node *A, int &n, Node key)
{
n++;
int i = n-1;
while(i > 0 && A[i/2] > key)
{
A[i] = A[i/2];
i = i/2;
}
A[i] = key;
}
//ERROR IS IN THIS FUNCTION
//I need to make a new node z and have it's left and right children
//point the the smallest two nodes in heap. When I assign the address
//of the x and y nodes to z.left and z.right it's fine. But then when
//I loop around again and reinitialize x, y, and z those address locations
//are destroyed and the left and right children no longer exist.
Node Huffman(Node *Q, int n)
{
while(n>1)
{
//ERROR IS THIS ASSIGNMENT OF VARIABLES
Node x,y,z;
x = extract_min(Q,n);
y = extract_min(Q,n);
z.left = &x;
z.right = &y;
z.freq = x.freq + y.freq;
insert(Q, n, z);
}
Node root = extract_min(Q,n);
print_node(root);
print_node(*root.left);
return root;
}
void traverse(Node x)
{
print_node(x);
if(x.left)
traverse(*x.left);
if(x.right)
traverse(*x.right);
}
int main(int argc, char *argv[])
{
Node B[] = {{'c',6},{'d',5},{'e',7},{'z',15}};
int n = 4;
build_min_heap(B,n);
Node C[4] = B;
int n_C = n;
cout<<"What it should print like\n";
//loop1
Node z1;
Node x1 = extract_min(B,n);
Node y1 = extract_min(B,n);
z1.left = &x1;
z1.right = &y1;
z1.freq = x1.freq+y1.freq;
insert(B,n,z1);
//loop2
Node z2;
Node x2 = extract_min(B,n);
Node y2 = extract_min(B,n);
z2.left = &x2;
z2.right = &y2;
z2.freq = x2.freq+y2.freq;
insert(B,n,z2);
//loop3
Node z3;
Node x3 = extract_min(B,n);
Node y3 = extract_min(B,n);
z3.left = &x3;
z3.right = &y3;
z3.freq = x3.freq+y3.freq;
insert(B,n,z3);
/*//loop4
Node z4;
Node x4 = extract_min(B,n);
Node y4 = extract_min(B,n);
z4.left = &x4;
z4.right = &y4;
z4.freq = x4.freq+y4.freq;
insert(B,n,z4);*/
Node root = extract_min(B,n);
traverse(root);
cout<<"What actually happens\n";
root = Huffman(C,n_C);
//print_node(root);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnN0cmVhbT4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGNzdHJpbmc+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgTm9kZQp7CgljaGFyIGRhdGE7Cgl1bnNpZ25lZCBmcmVxOwoJTm9kZSAqbGVmdCwgKnJpZ2h0OwogCglOb2RlKGNoYXIgZGF0YT0nICcsIHVuc2lnbmVkIGZyZXE9MCkKCXsKCQlsZWZ0ID0gcmlnaHQgPSBOVUxMOwoJCXRoaXMtPmRhdGEgPSBkYXRhOwoJCXRoaXMtPmZyZXEgPSBmcmVxOwoJfQoJYm9vbCBvcGVyYXRvcjwoTm9kZSB4KQoJewoJCXJldHVybiBmcmVxIDwgeC5mcmVxOwoJfQoJYm9vbCBvcGVyYXRvcj4oTm9kZSB4KQoJewoJCXJldHVybiBmcmVxID4geC5mcmVxOwoJfQp9Owp2b2lkIHByaW50X25vZGUoTm9kZSB4KQp7CglwcmludGYoIiVjOiAlZFxuIix4LmRhdGEseC5mcmVxKTsKCWlmKHgubGVmdCkKCQlwcmludGYoImxlZnQ6OiAlYzogJWRcbiIseC5sZWZ0LT5kYXRhLHgubGVmdC0+ZnJlcSk7CglpZih4LnJpZ2h0KQoJCXByaW50ZigicmlnaHQ6OiAlYzogJWRcbiIseC5yaWdodC0+ZGF0YSx4LnJpZ2h0LT5mcmVxKTsKCWNvdXQ8PGVuZGw7Cn0Kdm9pZCBzd2FwKE5vZGUgKngsTm9kZSAqeSkKewoJLy9wcmludGYoInhmOiAlZCB4ZDogJWMgeWY6ICVkICUgeWQ6ICVjXG4iLHgtPmZyZXEseC0+ZGF0YSx5LT5mcmVxLHktPmRhdGEpOwoJaW50IHRlbXAgPSB4LT5mcmVxOwoJeC0+ZnJlcSA9IHktPmZyZXE7Cgl5LT5mcmVxID0gdGVtcDsKCWNoYXIgdCA9IHgtPmRhdGE7Cgl4LT5kYXRhID0geS0+ZGF0YTsKCXktPmRhdGEgPSB0Owp9CnZvaWQgbWluX2hlYXBpZnkoTm9kZSAqQSwgaW50IG4sIGludCBpKQp7CglpbnQgbCA9IDIqKGkrMSktMTsgaW50IHIgPSAyKihpKzEpOwoJaW50IHNtYWxsZXN0OwoJaWYgKGwgPCBuICYmIEFbbF0gPCBBW2ldKQoJCXNtYWxsZXN0ID0gbDsKCWVsc2UKCQlzbWFsbGVzdCA9IGk7CglpZiAociA8IG4gJiYgQVtyXSA8IEFbc21hbGxlc3RdKQoJCXNtYWxsZXN0ID0gcjsKCWlmIChzbWFsbGVzdCAhPSBpKQoJewoJCXN3YXAoJkFbaV0sJkFbc21hbGxlc3RdKTsKCQltaW5faGVhcGlmeShBLG4sc21hbGxlc3QpOwoJfQp9CnZvaWQgYnVpbGRfbWluX2hlYXAoTm9kZSAqQSwgaW50IG4pCnsKCWZvcihpbnQgaSA9IG4vMi0xOyBpID49IDA7IGktLSkKCXsKCQltaW5faGVhcGlmeShBLG4saSk7Cgl9Cn0KTm9kZSBleHRyYWN0X21pbihOb2RlICpBLCBpbnQgJm4pCnsKCU5vZGUgbWluID0gQVswXTsKCUFbMF0gPSBBW24tMV07CgluLS07CgltaW5faGVhcGlmeShBLG4sMCk7CglyZXR1cm4gbWluOwp9CnZvaWQgaW5zZXJ0KE5vZGUgKkEsIGludCAmbiwgTm9kZSBrZXkpCnsKCW4rKzsKCWludCBpID0gbi0xOwoJd2hpbGUoaSA+IDAgJiYgQVtpLzJdID4ga2V5KQoJewoJCUFbaV0gPSBBW2kvMl07CgkJaSA9IGkvMjsKCX0KCUFbaV0gPSBrZXk7Cn0KLy9FUlJPUiBJUyBJTiBUSElTIEZVTkNUSU9OCi8vSSBuZWVkIHRvIG1ha2UgYSBuZXcgbm9kZSB6IGFuZCBoYXZlIGl0J3MgbGVmdCBhbmQgcmlnaHQgY2hpbGRyZW4KLy9wb2ludCB0aGUgdGhlIHNtYWxsZXN0IHR3byBub2RlcyBpbiBoZWFwLiBXaGVuIEkgYXNzaWduIHRoZSBhZGRyZXNzCi8vb2YgdGhlIHggYW5kIHkgbm9kZXMgdG8gei5sZWZ0IGFuZCB6LnJpZ2h0IGl0J3MgZmluZS4gQnV0IHRoZW4gd2hlbiAKLy9JIGxvb3AgYXJvdW5kIGFnYWluIGFuZCByZWluaXRpYWxpemUgeCwgeSwgYW5kIHogdGhvc2UgYWRkcmVzcyBsb2NhdGlvbnMKLy9hcmUgZGVzdHJveWVkIGFuZCB0aGUgbGVmdCBhbmQgcmlnaHQgY2hpbGRyZW4gbm8gbG9uZ2VyIGV4aXN0LgpOb2RlIEh1ZmZtYW4oTm9kZSAqUSwgaW50IG4pCnsKCQoJd2hpbGUobj4xKQoJewoJCS8vRVJST1IgSVMgVEhJUyBBU1NJR05NRU5UIE9GIFZBUklBQkxFUwkJCgkJTm9kZSB4LHksejsKCQl4ID0gZXh0cmFjdF9taW4oUSxuKTsKCQl5ID0gZXh0cmFjdF9taW4oUSxuKTsKCQl6LmxlZnQgPSAmeDsKCQl6LnJpZ2h0ID0gJnk7CgkJei5mcmVxID0geC5mcmVxICsgeS5mcmVxOwoJCWluc2VydChRLCBuLCB6KTsKCX0KCU5vZGUgcm9vdCA9IGV4dHJhY3RfbWluKFEsbik7CglwcmludF9ub2RlKHJvb3QpOwoJcHJpbnRfbm9kZSgqcm9vdC5sZWZ0KTsKCXJldHVybiByb290Owp9CnZvaWQgdHJhdmVyc2UoTm9kZSB4KQp7CQoJCglwcmludF9ub2RlKHgpOwoJaWYoeC5sZWZ0KQoJCXRyYXZlcnNlKCp4LmxlZnQpOwoJCglpZih4LnJpZ2h0KQoJCXRyYXZlcnNlKCp4LnJpZ2h0KTsKfQppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQp7CQoJTm9kZSBCW10gPSB7eydjJyw2fSx7J2QnLDV9LHsnZScsN30seyd6JywxNX19OwoJaW50IG4gPSA0OwoJYnVpbGRfbWluX2hlYXAoQixuKTsKCU5vZGUgQ1s0XSA9IEI7CglpbnQgbl9DID0gbjsKCWNvdXQ8PCJXaGF0IGl0IHNob3VsZCBwcmludCBsaWtlXG4iOwoJLy9sb29wMQoJTm9kZSB6MTsKCU5vZGUgeDEgPSBleHRyYWN0X21pbihCLG4pOwoJTm9kZSB5MSA9IGV4dHJhY3RfbWluKEIsbik7Cgl6MS5sZWZ0ID0gJngxOwoJejEucmlnaHQgPSAmeTE7Cgl6MS5mcmVxID0geDEuZnJlcSt5MS5mcmVxOwoJaW5zZXJ0KEIsbix6MSk7CgkvL2xvb3AyCglOb2RlIHoyOwoJTm9kZSB4MiA9IGV4dHJhY3RfbWluKEIsbik7CglOb2RlIHkyID0gZXh0cmFjdF9taW4oQixuKTsKCXoyLmxlZnQgPSAmeDI7Cgl6Mi5yaWdodCA9ICZ5MjsKCXoyLmZyZXEgPSB4Mi5mcmVxK3kyLmZyZXE7CglpbnNlcnQoQixuLHoyKTsKCS8vbG9vcDMKCU5vZGUgejM7CglOb2RlIHgzID0gZXh0cmFjdF9taW4oQixuKTsKCU5vZGUgeTMgPSBleHRyYWN0X21pbihCLG4pOwoJejMubGVmdCA9ICZ4MzsKCXozLnJpZ2h0ID0gJnkzOwoJejMuZnJlcSA9IHgzLmZyZXEreTMuZnJlcTsKCWluc2VydChCLG4sejMpOwoJLyovL2xvb3A0CglOb2RlIHo0OwoJTm9kZSB4NCA9IGV4dHJhY3RfbWluKEIsbik7CglOb2RlIHk0ID0gZXh0cmFjdF9taW4oQixuKTsKCXo0LmxlZnQgPSAmeDQ7Cgl6NC5yaWdodCA9ICZ5NDsKCXo0LmZyZXEgPSB4NC5mcmVxK3k0LmZyZXE7CglpbnNlcnQoQixuLHo0KTsqLwoJTm9kZSByb290ID0gZXh0cmFjdF9taW4oQixuKTsKCXRyYXZlcnNlKHJvb3QpOwoJCgljb3V0PDwiV2hhdCBhY3R1YWxseSBoYXBwZW5zXG4iOwoJcm9vdCA9IEh1ZmZtYW4oQyxuX0MpOwoJCgkvL3ByaW50X25vZGUocm9vdCk7CgkKCQoJcmV0dXJuIDA7CgkKfQ==