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!!!!
    }