What’s wrong with the following implementation of a binary search tree (BST)? I have been told that it is better to use pointer to a pointer to struct node as an argument in insert function.
struct node
{
int key_value;
struct node* left;
struct node* right;
};
insert(int key, struct node *leaf)
{
if( leaf == 0 )
{
leaf = (struct node*) malloc( sizeof( struct node ) );
leaf->key_value = key;
/* initialize the children to null */
leaf->left = 0;
leaf->right = 0;
}
else if(key < leaf->key_value)
{
insert( key, leaf->left );
}
else if(key > leaf->key_value)
{
insert( key, leaf->right );
}
}
This line:
gives a new value to
leaf, pointing it at some newly allocated memory. However, the new value does not leave the function. When the function returns, the caller will still be referring to the oldleaf, and there will be a memory leak.There are two approaches you could take to fixing it:
1. Use a pointer to a pointer, e.g.
2. Return the new leaf (or the old leaf if there is no change).
Pointers to pointers are close to the threshold of being hard to comprehend. I would probably go for the second option, if
insertisn’t currently returning anything else.