用递归方式建立的二叉树不能输出,该怎么处理

用递归方式建立的二叉树不能输出
我用递归建立了二叉树,但是不能输出,请大家帮忙看看,小弟分不多,请见谅。上代码:


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

struct BiTNode {
char data;
struct BiTNode* lchild; //二叉树的结构
struct BiTNode* rchild;
};

typedef struct BiTNode * BiTree ; 

void CreatBiTree( BiTree ); //创建二叉树
void PreOrderTraverse(BiTree ); // 遍历该二叉树,打印各个节点的值

main(){
BiTree T=NULL; //T为根节点

CreatBiTree( T ) ;
PreOrderTraverse( T ) ;

system("pause");
return 0;
}


//用先序递归过程建立二叉树

void CreatBiTree( BiTree T) {
char ch;

scanf("%c",&ch);
if( ch == '*') //如果输入星号则二叉树的节点为空节点
T=NULL;
else {
T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间
if(T!=NULL){
T->data=ch;  
CreatBiTree(T->lchild); //分配成功则继续建立左子树和右子树
CreatBiTree(T->rchild);  
}
else{
printf("内存分配失败!");  
return ;
}
}  



void PreOrderTraverse(BiTree T){  
if (T) {
printf("%c",T->data); 
PreOrderTraverse(T->lchild) ; //遍历该树,输出各个节点的值
PreOrderTraverse(T->lchild) ;
}
else return;


我在屏幕上输入 ab**c** 却没有输出,为什么?




------解决方案--------------------
C/C++ code

void CreatBiTree( BiTree &T)////传递指针的引用试试
 {
char ch;

scanf("%c",&ch);
if( ch == '*') //如果输入星号则二叉树的节点为空节点
T=NULL;
else {
T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间
if(T!=NULL){
T->data=ch;   
CreatBiTree(T->lchild); //分配成功则继续建立左子树和右子树
CreatBiTree(T->rchild);   
}
else{
printf("内存分配失败!");   
return ; 
}
}   
}

------解决方案--------------------
可能是创建二叉树的代码有点问题,改一下看看:
void CreatBiTree(BiTree *t)
{
char ch;
if((ch=getchar())==' ')
*t=null;
else
{
*t=(struct BiTNode *)malloc(sizeof(struct BiTNode));
(*t)->data=ch;
CreatBiTree(&(*t)->lchild);
CreatBiTree(&(*t)->rchild);
}
}

------解决方案--------------------
void CreatBiTree( BiTree *T) {
char ch;
scanf("%c",&ch);
if(ch=='*') //如果输入星号则二叉树的节点为空节点
{
(*T) = NULL;
return;
}
else 
{
*T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间
if(*T!=NULL)
{
(*T)->data=ch;
CreatBiTree(&(*T)->lchild); //分配成功则继续建立左子树和右子树
CreatBiTree(&(*T)->rchild);
}
else{
printf("内存分配失败!");
return ; 
}
}
}

------解决方案--------------------
C/C++ code

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

struct BiTNode {
char data;
struct BiTNode* lchild; //二叉树的结构
struct BiTNode* rchild;
};

typedef struct BiTNode * BiTree ;  

void CreatBiTree( BiTree &); //创建二叉树--------------改成按引用创建二叉树
void PreOrderTraverse(BiTree ); // 遍历该二叉树,打印各个节点的值

int main(){
BiTree T = NULL; //T为根节点

CreatBiTree( T ) ;
PreOrderTraverse( T ) ;

system("pause");
return 0;
}


//用先序递归过程建立二叉树

void CreatBiTree( BiTree &T) 
{
    char ch;
    scanf("%c",&ch);
    if( ch == '*') //如果输入星号则二叉树的节点为空节点
    {
        T=NULL;
        return ;//缺少一个return
    }
    else 
    {
        T=(BiTree)malloc( sizeof(struct BiTNode) ) ; //如果输入的不是星号。则为新节点分配内存空间
        if(T!=NULL)
        {
            T->data=ch;
            CreatBiTree(T->lchild); //分配成功则继续建立左子树和右子树
            CreatBiTree(T->rchild);   
        }
        else
        {
            printf("内存分配失败!");   
            return ; 
        }
    }   
}  


void PreOrderTraverse(BiTree T){   
if (T) 
{
printf("%c",T->data);  
PreOrderTraverse(T->lchild) ; //遍历该树,输出各个节点的值
PreOrderTraverse(T->rchild) ;//----------这个地方有错
}
else
{
    return;
}
}