树-二叉树的创建和先序遍历 怎么错了 一直输出不了

输入
在一行上输入若干个字符以建立一棵二叉树,遇‘#’表示建立一个空二叉树。
输出
二叉树的先序遍历序列
样例输入 Copy
ABD#CE#
样例输出 Copy
ABDCE

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct BiTNode {
    char data;
    struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;

void InitBiTree(BiTree &T);
void CreateBiTree(BiTree &T);
void PreOrderTraverse(BiTree T);

int main(void) {
    BiTree T;
    InitBiTree(T);
    CreateBiTree(T);
    PreOrderTraverse (T);
    return 0;
}


/* 构造空二叉树T */
void InitBiTree(BiTree &T) {
    T=(BiTree)malloc(sizeof(BiTNode));
    T->lchild=NULL;
    T->rchild=NULL;
}

/* 按先序输入二叉树中结点的值(一个字符) */
/* #表示空树,构造二叉链表表示二叉树T。 */
void CreateBiTree(BiTree &T) {
    char ch;
    ch=getchar();
    if (ch == '*')
        T= NULL;
    else
    {
    T->lchild=(BiTree)malloc(sizeof(BiTNode));
    T->rchild=(BiTree)malloc(sizeof(BiTNode));
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
}

/*先序递归遍历T */
void PreOrderTraverse(BiTree T) {
    if (T!=NULL)
    {
        putchar(T->data);
        PreOrderTraverse(T->lchild);    
        PreOrderTraverse(T->rchild);
    }
}


恕我比较菜,真的第一次见有人用&T来作为参数的,不应该是指针吗?
你这个typdef的方法也太不常见了😂

void InitBiTree(BiTree* T);
void CreateBiTree(BiTree* T);

int main() {
    BiTree T;
    InitBiTree(&T);
    CreateBiTree(&T);
    return 0;
}

代码没什么问题啊,遇‘#’表示建立一个空二叉树, 代码里第35行是 if (ch == '*') T= NULL; 与题目要求不符,应修改为: if (ch == '#') T= NULL; 。 按代码,输入应是:ABD#CE##### 。