HB皓月 2023-10-30 20:42 采纳率: 80%
浏览 14
已结题

二叉树创建时,程序直接结束了

创建并输入二叉树时,只能输入一个元素,即只能添加根root。
1.代码如下:

#include<stdio.h>
#include<stdlib.h>
int K = 0; 
typedef struct viTree{
    int num;
    viTree *lchild;
    viTree *rchild;
}viTree;
void InitviTree(viTree *T){            //初始化 
    T = (viTree *)malloc(sizeof(viTree));
    //T -> num = NULL;
    T -> lchild = NULL;
    T -> rchild = NULL;
}
void createviTree(viTree *T){        //创建 
    //printf("aaa");
    int n;
    scanf("%d",&n);
    if(n != -1){
        T -> num = n;
        createviTree(T -> lchild);
        printf("bbb");                 //调试语句 
        createviTree(T -> rchild);
        printf("ccc");                 //调试 
        
    }
    else{
        printf("ddd");
        T = NULL;
        return;
    }
}
int firstFindTree(viTree *T,int k){
    if(T != NULL){
        K++;
        if(K == k){
            return T -> num;
        }
        else{
            firstFindTree(T -> lchild,k);
            firstFindTree(T -> rchild,k);
        }
    }    
}
int main(){
    viTree Tree;
    InitviTree(&Tree);
    printf("请输入二叉树:\n");
    createviTree(&Tree);
    int k;
    printf("请输入要查询的位置:"); 
    scanf("%d",&k);
    printf("第%d个位置的值为%d",k,firstFindTree(&Tree,k));
} 

2.在控制台输入

  • 创建root=2 ,lchild=3,rchild=4,程序直接结束了

img

  • 只有创建root=2,lchild=-1,rchild=-1即根的左右子树都为空时才能正常运行

img

不知道是什么原因,用二重指针也是这个结果,求解惑!

  • 写回答

3条回答 默认 最新

  • HB皓月 2023-11-09 20:04
    关注

    最后解决了,我想是使用malloc时的问题,我将viTree结构体设置成为*viTree后,在InitiviTree时,直接传入viTree的地址后,再在函数中使用malloc为树在堆中分配空间之后可以顺利存储了。

    #include<stdio.h>
    #include<stdlib.h>
    //#define NULL ((void *)0)
    //using namespace std;
    int K = 0; 
    typedef struct treeNode{
        int num;
        treeNode *lchild;
        treeNode *rchild;
    }treeNode,*viTree;
    void InitviTree(viTree &T){            //初始化 
        T = (treeNode *)malloc(sizeof(treeNode));   //在堆中分配空间
        //T = new viTree;
        //T -> num = 0;
        T -> lchild = NULL;
        T -> rchild = NULL;
    }
    void createviTree(viTree T){        //创建 
        InitviTree(T); 
        int n;
        scanf("%d",&n);
        if(n != -1){
            //printf("kkk");
            //printf("%d",n) ;
            T -> num = n;
            //printf("%d",T->num);
            createviTree(T -> lchild);
            //printf("bbb");                 //调试语句 
            createviTree(T -> rchild);
            //printf("ccc");                 //调试 
            
        }
        else{
            //printf("ddd");
            T = NULL;
            return;
        }
    }
    void printviTree(viTree T){
        if(T){
            return ;
        }
        else{
            K++;
            printf("第%d个数字为:%d\n",K,T->num);
            printviTree(T->lchild);
            printviTree(T->rchild);
        }
    }
    int firstFindTree(viTree T,int k){
        if(T != NULL){
            K++;
            if(K == k){
                return T -> num;
            }
            else{
                firstFindTree(T -> lchild,k);
                firstFindTree(T -> rchild,k);
            }
        }    
    }
    int main(){
        viTree Tree;
        //InitviTree(&Tree);
        printf("请输入二叉树:\n");
        createviTree(Tree);
        printf("二叉树为:\n");
        printviTree(Tree);
        int k;
        /*printf("请输入要查询的位置:"); 
        scanf("%d",&k);
        printf("第%d个位置的值为%d",k,firstFindTree(Tree,k));*/
    } 
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月17日
  • 已采纳回答 11月9日
  • 创建了问题 10月30日

悬赏问题

  • ¥66 换电脑后应用程序报错
  • ¥50 array数据同步问题
  • ¥15 pic16F877a单片机的外部触发中断程序仿真失效
  • ¥15 Matlab插值拟合差分微分规划图论
  • ¥15 keil5 target not created
  • ¥15 C/C++数据与算法请教
  • ¥15 怎么找志同道合的伙伴
  • ¥20 如何让程序ab.eXe自已删除干净硬盘里的本文件自己的ab.eXe文件
  • ¥50 爬虫预算充足,跪巨佬
  • ¥15 滑块验证码拖动问题悬赏