刚刚学二叉树,编了个程序,不知道哪错了.求大神修改

刚学二叉树,编了个程序,不知道哪错了.求大神修改
#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
struct node *lchild,*rchild;
int key;
}BTnode,*BTree;

void Insert(BTree s,int key);
void CreatTree(BTree s,int n);
BTree serch(BTree s,int key);

void CreatTree(BTree s,int n)//创建树
{
int i;
int key;
for(i=0;i<n;i++)
{
scanf("%d",&key);
    Insert(s,key);
}
}
void Insert(BTree s,int key)//插入数据
{
BTree p;
int flao=0;
if(s==NULL)
{
p=(BTree)malloc(sizeof(node));
p->key=key;
p->rchild=NULL;
p->lchild=NULL;
s=p;
}
else if(key>s->key)
Insert(s->rchild,key);
else if(key<s->key)
Insert(s->lchild,key);


}
BTree serch(BTree s,int key)//查找
{
if(s==NULL)
return 0;
if(s->key==key)
return s;
else if(key>s->key)
return serch(s->rchild,key);
else 
    return serch(s->lchild,key);
}
int main()
{
    BTnode s;
int key,n=5;
printf("输入需要构建的数据\n");
CreatTree(&s,n);
return 0;
}
这个还没编完,中途试下之后发现一输入数据就弹出个框提示错误了,弄了好久不知道哪里错了,求大神帮忙
= =刚刚学二叉树,编了个程序,不知道哪错了.求大神修改

------解决方案--------------------
if(s==NULL){
p=(BTree)malloc(sizeof(node));
p->key=key;
p->rchild=NULL;
p->lchild=NULL;
s=p;
}
------解决方案--------------------
仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct node {
    char *word;
    struct node *left, *right;
};

struct node *tree;

void showTree(struct node *aTree) {
    if (aTree == NULL) return;
    printf(" @%p: %s \t/%p\t\t\\%p\n", aTree, aTree->word, aTree->left, aTree->right);
    showTree(aTree->left);
    showTree(aTree->right);
}

struct node *nodeWith(char *aWord) {
    struct node *node;
    node = (struct node *)calloc(1,sizeof(struct node));
    node->word = aWord;
    return (node);
}

// Pretty much as Rubin started it on the board and others refined
struct node *findOrInsert(struct node *aTree, char *aWord) {
    int cmp;
    printf("findOrInsert(...%s\n", aWord);
    if ((cmp = strcmp(aWord, aTree->word)) == 0) return(aTree);
    if (cmp < 0) {
        if (aTree->left) return (findOrInsert(aTree->left, aWord));
        aTree->left = nodeWith(aWord);
        return (aTree->left);
    } else {
        if (aTree->right) return (findOrInsert(aTree->right, aWord));
        aTree->right = nodeWith(aWord);
        return (aTree->right);
    }
}

int main() {
    tree = (struct node *)calloc(1,sizeof(struct node));
    tree->word = "root";
    showTree(tree);
    findOrInsert(tree, "leave");
    showTree(tree);
    findOrInsert(tree, "house");
    showTree(tree);
    findOrInsert(tree, "mouse");
    showTree(tree);
    findOrInsert(tree, "house");
    showTree(tree);
    return 0;
}
// @00411900: root        /00000000               \00000000