二叉树采用二叉链表存储,完善代码完成递归函数

二叉树采用二叉链表存储,请问如何编写完善递归函数BiTree copy_bin_tree(BiTree bt),复制输入的一棵二叉树 bt ,并返回新二叉树的根结点地址。

/*
// 参考代码
*/

#include 
#include 

//二叉链表结点结构体
typedef struct BiTNode{
    int data;
    struct BiTNode * lchild, * rchild;
} BiTNode, * BiTree;


//先序遍历序列建立二叉树的二叉链表
void  CreateBinTree(BiTree *T)
{  
   int ch;

   scanf(";\;n%d";,&ch);

   if(ch == 0)  *T=NULL;  // 收到字符0则终止对应分支的创建
   else
   {   *T=(BiTNode *)malloc(sizeof(BiTNode));
       (*T)->data=ch;
       CreateBinTree(&(*T)->lchild);
       CreateBinTree (&(*T)->rchild);
   }
}

// 先序遍历打印结点数据域
void preorder(BiTree bt)
{
    if(bt == NULL) return;

    printf(";%d\;t";, bt->data);
    preorder(bt->lchild);
    preorder(bt->rchild);
    
    return;
}

// 销毁二叉树
void  destroy_bin_tree(BiTree bt)
{  
    if(bt == NULL) return;

    destroy_bin_tree(bt->lchild);
    destroy_bin_tree(bt->rchild);
    free(bt);     
}

// 拷贝输入的二叉树
BiTree CopyBinTree(BiTree bt)
{
    // TODO(10分): 待完善

    return 0;
}

void main()
{
    BiTree T1;
    BiTree T2;

    printf(";请按先序遍历输入数值以创建二叉树,输入0代表对应子树为空\;n";);

    CreateBinTree(&T1);

    printf(";\;n先序遍历打印原始二叉树:\;n";);
    preorder(T1);

    // 拷贝输入的二叉树
    T2 = CopyBinTree(T1);

    printf(";\;n先序遍历打印拷贝二叉树:\;n";);
    preorder(T2);

    // 销毁二叉树
    destroy_bin_tree(T1);
    destroy_bin_tree(T2);

    printf(";\;n完成销毁二叉树\;n";);

    return;
}