I created a program which, so far, creates a binary tree of nodes for a Huffman coding program. For some reason, when the debugger gets to the point where it tests if the two children equal Null or not (so there an actual character on the tree and not just a parent), the program freezes. Codes is an array of the codes for each object comprising of Code structs which have two member variables.
void Huff::traverse(Node* root, vector<Code>* code, string code_base){
if(root->childL == NULL && root->childR == NULL){ //stops here
Code c;
c.content = root->litteral;
c.symbol = code_base;
code->push_back(c);
}else{
if (root->childL != NULL)
traverse(root->childL, code, code_base + '0');
if (root->childR != NULL)
traverse(root->childR, code, code_base + '1');
}
}
The function which calls this one is (it’s called towards the end):
vector<Code>* Huff::compress(){
//-------GETTING WEIGHTS/FREQUENCIES------
vector<Node *>* nodes = new vector<Node*>; // Vector of nodes for later use
map<char, int>* freq = new map<char, int>; // Map to find weight of nodes
for(unsigned int i = 0; i < content.length(); i++)
(*freq)[content[i]]++;
CopyTo copyto(nodes); //sets vector<Node*> to copy to
for_each(freq->begin(), freq->end(), copyto); // Copies
delete freq;
vector<Node *>::iterator beg = nodes->begin();
//-------SETTING UP TO BUILD TREE------
if(nodes->size() % 2 == 1){ //makes sure there are an even number of nodes
Node* fill = new Node;
fill->set_node(0, '*', NULL, NULL);
nodes->push_back(fill);
}
huff_sort(nodes); // sort nodes by weight
//-------BUILDING TREE------
while(nodes->size() != 1){ //Sorts nodes by weight and then removes two of them and replaces them with one
int w= (**beg).weight + (**(beg+1)).weight;
Node* p = new Node;
p->set_node(w, '*', *nodes->begin(), *(nodes->begin()+1)); //making it the parent node of the two lowest nodes
nodes->erase(nodes->begin(), nodes->begin()+2);
unsigned int i = 0;
while(w > (*nodes)[i]->weight && i <= nodes->size()){ //finds where to insert the parent node based on weight
i++;
}
if(i > nodes->size()) //if it needs to be inserted at the end
nodes->push_back(p);
else
nodes->insert(nodes->begin()+i, p);
delete p;
}
//-------TRAVERSING TREE------
Node* root = (*nodes)[0];
delete nodes;
vector<Code>* codes;
traverse(root, codes , "");
delete root;
return codes;
}
Note: The while loop before the traverse tree block of code is where the tree is created
You need to say
delete nodes;after you calltraverse. What you have right now makesrootpoint toNULLbefore you calltraverse.