delete a key in a trie
Check your indentation, mostly for comments. While there are a lots of indent styles for C, none of them recommends removing the spaces after if and for.
Using recursive functions is not the idiomatic way of doing things in C, but that's OK.
It's generally better to check for error conditions before, and handle the general case afterwards. This is a good idea because the "error condition" is generally smaller. For example, if you check for root == NULL case first, the reader doesn't have to remember that there is possibly an else branch. This will also force you to make return false cases more explicit in your if/else branches. I think it's a good thing.
You can write if (root-&gt;mark) instead of if(root-&gt;mark==1).
This code is too long:

// Is it an unique key?
if (isFreeNode(root))
{
    return true;
}
return false;


Simple write return isFreeNode(root);. Same thing for (!isLeafNode(root) &amp;&amp; isFreeNode(root))
*(key+level) should be written key[level].
You don't set trie-&gt;root to NULL after freeing it: this is not consistent with the earlier free().