In int bt_depth(struct BTnode * tree)
Too many different checks for NULL.
You only need to check once. The call to bt_depth() on the left and right nodes will perform there own explicit checks don't try and pre optimize.
int bt_depth(struct BTnode * tree)
{
if( tree == NULL ) return 0;
int leftdepth = bt_depth(tree->left);
int rightdepth = bt_depth(tree->right);
return max(leftdepth, rightdepth) + 1;
}
In int bt_encode_preorder(int * list, struct BTnode * tree, int index)
You are using tree without check for NULL tree
list[ index++ ] = tree->data;
You are also doing a recursive call without checking.
At some point you may end up hitting a NULL and trying to de-reference it.
if( tree->left != NULL )
{
index = bt_encode_preorder(list, tree->left, index);
index = bt_encode_preorder(list, tree->right, index); // tree->right may be NULL!!!!
}