I have implemented a removeSelection
function that removes a specific node from a leftist heap. The code locates the node via a hashtable that keeps track of the keys that have been inserted into the heap. The node is then percolated to the root of the heap and deleteMin
is called to delete it. The code seems to be failing in the swapWithParent
function that percolateUp
calls and it generates a seg fault.
This is the function to be called from main on a heap:
bool removeSelection( const Comparable & x )
{
LeftistNode * temp = locateNode( x ); //find the node with the item
if(temp == NULL)
return false;
//percolate that node to the top
percolateUp(temp);
//delete the root
int derp = 0; //deleteMin requires an int be passed
deleteMin(derp);
return true;
}
The percolateUp
function:
void percolateUp( LeftistNode * t )
{
if(t != NULL)
{
while(t != root)
{
t = swapWithParent(t->parent, t);
}
}
}
The swapWithParent
function:
//swap h2 with its parent h1
//return pointer to h2's new location
LeftistNode * swapWithParent(LeftistNode * h1, LeftistNode * h2)
{
//if h2 is its parent's left child
if(h2 == h1->left)
{
LeftistNode *temp = new LeftistNode(h2->element, -1, h1->parent, h1->left, h1->right, h1->npl); //clone h1 and store as a temp
temp->lines = h2->lines;
//update all pointers
h1->parent = h2;
if(h1->right != NULL)
h1->right->parent = h2;
h1->left = h2->left;
h1->right = h2->right;
h2 = temp;
return h2;
}
else
{
LeftistNode *temp = new LeftistNode(h2->element, -1, h1->parent, h1->left, h1->right, h1->npl); //clone h1 and store as a temp
temp->lines = h2->lines;
//update all pointers
h1->parent = h2;
if(h1->left != NULL)
h1->left->parent = h2;
h1->left = h2->left;
h1->right = h2->right;
h2 = temp;
return h2;
}
}
Are there perhaps any places where I might be dereferencing a NULL pointer? I have checked, but I cannot seem to find the error.