二叉树创建时的指针有关问题

二叉树创建时的指针问题
部分源代码:
typedef char ElemType;
typedef struct node
{
ElemType data;
struct node * lchild;
struct node * rchild;
}node, *Tree;

void CreateTree( Tree tree )
{
tree = ( Tree )malloc( sizeof( struct node ) );
        ......
}

int main( void )
{
Tree bitree;
CreateTree( bitree );

system( "pause" );
return 0;
}
程序报错!
1."The variable bitree is being used without being initialized"
我不明白,在main函数中创建了一个指向node的指针。
在CreateTree中对其进行初始化为什么不行呢?
2.我在网上看了一些程序,
比如这个:
typedef struct treenode  
{  
    char data;  
    int weight;  
    treenode *left;  
    treenode *right;  
}Treenode,*Treep;  
  
//初始化二叉树  
void init_tree(Treep &root)  
{  
    root=NULL;    
}  
我不明白init_tree中的形参的意思?root是什么类型的变量?Treep在这里是将它强制转换吗成Treep型吗?
好纠结啊?

------解决方案--------------------
C语言写法
不要和C++里面的引用(&)搞混了
#include<stdio.h>
#include<stdlib.h>
typedef  struct  btnode{
   char  data;
   struct btnode  *lchild, *rchild;
   }BTNode;
typedef struct{
   BTNode elem[20];
   int front,rear;
   }SqQueue;
BTNode * CreatTree( void );
void  Preorder(BTNode *bt );
void  Inorder(BTNode *bt );
void  Postorder(BTNode *bt );
void  Levelsorder(BTNode *bt);
void  ExChangeLeafs(BTNode *bt);
void  EnQueue(SqQueue *sq,BTNode *bt);
void  DelQueue(SqQueue *sq,BTNode *p);
void  InitQueue(SqQueue *sq);
void Disptree(BTNode *bt);
main()
{
  BTNode *t;
  char s[10];
  for(;;)
  {
      printf("1--------CreatTree    2-----------Preorder  \n");
      printf("3--------Inorder      4-----------Postorder  \n");
      printf("5--------Levelsorder  6-----------ExchangeLeafs(Preorder)  \n");
      printf("7--------Exit\n");
      gets(s);
      switch(*s)
      {
        case '1':  t=CreatTree();
                   break;
case '2':  Preorder(t);
                   printf("\n");
                   break;
        case '3':  Inorder(t);
                   printf("\n");