c语言数据结构二叉树无法结束输入

问题遇到的现象和发生背景

运行没有错误但是只能输入左子树无法输入右子树

问题相关代码,请勿粘贴截图
#include<stdio.h>
#include<stdlib.h>

typedef struct Tree
{
 int data;                    //存放数据域
 struct Tree *lchild;        //左子树指针
 struct Tree *rchild;        //右子树指针
}Tree,*BiTree;

BiTree CreateLink()
{
    int data;
    int temp;
    BiTree T;
    scanf("%d",&data);        //输入数据
    temp=getchar();              //吸收空格
    if(data == -1){            //-1表示无子树 
        return NULL;
    }
    else{
        T = (BiTree)malloc(sizeof(Tree));     //分配内存空间
        T->data = data;                          //把当前输入的数据存入当前节点指针的数据域中
        printf("请输入%d的左子树: ",data);
        T->lchild = CreateLink();             //开始递归创建左子树
        if(data==-1){
            printf("请输入%d的右子树: ",data);
            T->rchild = CreateLink();               //开始到上一级节点的右边递归创建左右子树      问题是:输入左子树之后无法输入右子树 ... 
            if(data==-1)
            return T; 
            }
        return T;                            //返回根节点
    }    
}

void PreOrderTraverse (BiTree T)    //先序遍历二叉树
{
    if(T==NULL)                        //递归中遇到NULL,返回上一层节点
    {
        return;
    }
    printf("%d",T->data);
    PreOrderTraverse (T->lchild);    //递归遍历左子树
    PreOrderTraverse (T->rchild);    //递归遍历右子树
}

void InOrderTraverse (BiTree T)        //中序遍历二叉树
{
    if(T==NULL)                        //递归中遇到NULL,返回上一层节点
    {
        return;
    }
    InOrderTraverse (T->lchild);     //递归遍历左子树
    printf("%d",T->data);             //访问根结点
    InOrderTraverse (T->rchild);     //递归遍历右子树
}

void PostOrderTraverse (BiTree T)    //后序遍历二叉树
{
    if(T==NULL)                           //递归中遇到NULL,返回上一层节点
    {
        return;
    }
    
    PostOrderTraverse (T->lchild);        //递归遍历左子树
    PostOrderTraverse (T->rchild);        //递归遍历右子树
    printf("%d",T->data);
}

int main()
{
    BiTree S;
    printf("第一个节点数据:\n");
    S = CreateLink();             //二叉树根节点
    
    printf("先序遍历结果: \n");
    PreOrderTraverse (S);       //先序遍历二叉树

    printf("\n中序遍历结果: \n");
    InOrderTraverse (S);      //中序遍历二叉树
    
    printf("\n后序遍历结果: \n");
    PostOrderTraverse (S);      //后序遍历二叉树
    
    return 0;    
}     


运行结果及报错内容

img

我的解答思路和尝试过的方法

尝试过改变结束输入左子树和右子树的条件,但是改变了之后条件用不了,无法结束左子树的输入

我想要达到的结果

先输入左子树,后输入右子树,然后按三种不同方式输出

BiTree CreateLink()
{
    int data;
    int temp;
    BiTree T;
    scanf("%d",&data);        //输入数据
    temp=getchar();              //吸收空格
    if(data == -1){            //-1表示无子树 
        return NULL;
    }
    else{
        T = (BiTree)malloc(sizeof(Tree));     //分配内存空间
        T->data = data;                          //把当前输入的数据存入当前节点指针的数据域中
        printf("请输入%d的左子树: ",data);
        T->lchild = CreateLink();             //开始递归创建左子树
        if(data==-1){
            printf("请输入%d的右子树: ",data);
            T->rchild = CreateLink();               //开始到上一级节点的右边递归创建左右子树      问题是:输入左子树之后无法输入右子树 ... 
            if(data==-1)
            return T; 
            }
        return T;                            //返回根节点
    }    
}

改为

BiTree CreateLink()
{
    int data;
    int temp;
    BiTree T;
    scanf("%d", &data);        //输入数据
    temp = getchar();              //吸收空格
    if (data == -1) {            //-1表示无子树 
        return NULL;
    }
    else {
        T = (BiTree)malloc(sizeof(Tree));     //分配内存空间
        T->data = data;                          //把当前输入的数据存入当前节点指针的数据域中
        printf("请输入%d的左子树: ", data);
        T->lchild = CreateLink();             //开始递归创建左子树
        printf("请输入%d的右子树: ", data);
        T->rchild = CreateLink();               //开始到上一级节点的右边递归创建左右子树      问题是:输入左子树之后无法输入右子树 ... 
    }
    return T; 
}

运行结果如下

img

通过递归建立二叉树的,先左后右,不需要单独判断
修改如下

img

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

typedef struct Tree
{
    int data;                    //存放数据域
    struct Tree *lchild;        //左子树指针
    struct Tree *rchild;        //右子树指针
} Tree,*BiTree;

BiTree CreateLink()
{
    int data;
    int temp;
    BiTree T;
    scanf("%d",&data);        //输入数据
    temp=getchar();              //吸收空格
    if(data == -1) {           //-1表示无子树
        return NULL;
    }
    else {
        T = (BiTree)malloc(sizeof(Tree));     //分配内存空间
        T->data = data;                          //把当前输入的数据存入当前节点指针的数据域中
        printf("请输入%d的左子树: ",data);
        T->lchild = CreateLink();             //开始递归创建左子树
        printf("请输入%d的右子树: ",data);
        T->rchild = CreateLink();               //开始到上一级节点的右边递归创建左右子树      问题是:输入左子树之后无法输入右子树 ...
    }
    return T;                            //返回根节点
}

void PreOrderTraverse (BiTree T)    //先序遍历二叉树
{
    if(T==NULL)                        //递归中遇到NULL,返回上一层节点
    {
        return;
    }
    printf("%d",T->data);
    PreOrderTraverse (T->lchild);    //递归遍历左子树
    PreOrderTraverse (T->rchild);    //递归遍历右子树
}

void InOrderTraverse (BiTree T)        //中序遍历二叉树
{
    if(T==NULL)                        //递归中遇到NULL,返回上一层节点
    {
        return;
    }
    InOrderTraverse (T->lchild);     //递归遍历左子树
    printf("%d",T->data);             //访问根结点
    InOrderTraverse (T->rchild);     //递归遍历右子树
}

void PostOrderTraverse (BiTree T)    //后序遍历二叉树
{
    if(T==NULL)                           //递归中遇到NULL,返回上一层节点
    {
        return;
    }

    PostOrderTraverse (T->lchild);        //递归遍历左子树
    PostOrderTraverse (T->rchild);        //递归遍历右子树
    printf("%d",T->data);
}

int main()
{
    BiTree S;
    printf("第一个节点数据:\n");
    S = CreateLink();             //二叉树根节点

    printf("先序遍历结果: \n");
    PreOrderTraverse (S);       //先序遍历二叉树

    printf("\n中序遍历结果: \n");
    InOrderTraverse (S);      //中序遍历二叉树

    printf("\n后序遍历结果: \n");
    PostOrderTraverse (S);      //后序遍历二叉树

    return 0;
}