silencesilent6 2023-06-06 09:50 采纳率: 0%
浏览 10

是关于c语言二叉树的,代码运行结果不对,感觉主函数有问题

这个代码不知道哪里错了,感觉应该是主函数的问题,编译不报错但是运行就会有问题

img

就是像这样,输入了。但是无结果,本来它应该继续向下显示一行先序遍历结果的,但是它现在什么也不显示,到底是为什么啊,我觉得是主函数少了什么东西。但是又搞不明白是什么东西。

这个是题目

任务:建立二叉树,并实现二叉树的遍历以及求根结点到指定结点的路径。(要用c语言)

功能要求:

建立二叉树存储结构;
对二叉树进行先序、中序、后序、层序遍历,并输出对应遍历序列;
求根结点到指定结点的路径。
界面要求:程序运行后,给出菜单项的内容和输入提示:

建立二叉树存储结构
求二叉树的先序遍历序列
求二叉树的中序遍历序列
求二叉树的后序遍历序列
求二叉树的层序遍历序列
求根结点到指定结点的路径
退出
请选择0-5:

#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct BiTNode {//二叉树结点
    char data;                      //数据
    struct BiTNode *lchild,*rchild; //左右孩子指针
} BiTNode,*BiTree;
//    链栈 
typedef struct STACK{
    int data;
    struct STACK *next;    
}StackNode,*Stack; 
int flag;    //    标记符 
Stack L;    //    链栈头节点指针 
//************************* 二叉树 ***********************// 
//    创建二叉树 
int nn=0;
int CreateBiTree(BiTree *T) 
{//按先序序列创建二叉树
    char data;
    scanf("%c",&data);//按先序次序输入二叉树中结点的值(一个字符),'#'表示空树
    if (data == '#') 
    {
        *T = NULL;
    } 
    else
     {
        *T = (BiTree)malloc(sizeof(BiTNode)); nn++;
        (*T)->data = data;         //生成根结点
        CreateBiTree(&(*T)->lchild);//构造左子树
        CreateBiTree(&(*T)->rchild);//构造右子树
    }
    return 0;
}
void Visit(BiTree T)
 {//输出
    if (T->data != '#')
     {
        printf("%c ",T->data);
    }
}
void PreOrder(BiTree T) 
{//先序遍历
    if (T != NULL) 
    {
        Visit(T);               //访问根节点
        PreOrder(T->lchild);    //访问左子结点
        PreOrder(T->rchild);    //访问右子结点
    }
}
void InOrder(BiTree T) 
{//中序遍历
    if (T != NULL) 
    {
        InOrder(T->lchild);     //访问左子结点
        Visit(T);               //访问根节点
        InOrder(T->rchild);     //访问右子结点
    }
}
void PostOrder(BiTree T) 
{//后序遍历
    if (T != NULL) {
        PostOrder(T->lchild);   //访问左子结点
        PostOrder(T->rchild);   //访问右子结点
        Visit(T);               //访问根节点
    }
}
typedef struct BiTNodePost{
    BiTree biTree;
    char tag;
} BiTNodePost,*BiTreePost;

void LevelOrder(BiTree T) {//层次遍历
    BiTree p;
    BiTree *queue;
    int h=0,t=0,n=0;
    if (T == NULL) return;
    p=T;
    queue=(BiTree *)malloc(nn*sizeof(BiTree));
    queue[t]=p;t=(t+1)%10;n++;//根节点入队
    while (n) {    //队列不空循环
        p=queue[h];             //对头元素出队
        printf("%c ",p->data);  //访问p指向的结点
        h=(h+1)%10;n--;         //退出队列
        if (p->lchild != NULL) {//左子树不空,将左子树入队
            queue[t]=p->lchild;t=(t+1)%10;n++;
        }
        if (p->rchild != NULL) {//右子树不空,将右子树入队
            queue[t]=p->rchild;t=(t+1)%10;n++;
        }
    }
    free(queue);
}
//************************* 链 栈 *********************//

//    入栈
void PushStack(int x)
{
    Stack top;
    top = (Stack)malloc(sizeof(StackNode));
    top->data = x;
    top->next = L;        //    第一次是让一开始的头节点存入元素,尾巴指向NULL已经初始化好
    L = top;            //    之后便是创建新的链栈节点和之前的串起来
} 

//    出栈
int PopStack()
{
    int x;
    
    if(L->next==NULL)    //    栈空
    {
        printf("出栈完毕\n");
        exit(-1);
    }else{
        
        Stack p;
        x = L->data;
        p = L;            //    让原来的L变成P 
        L = p->next;    //    原来头节点next指向的变成新的头节点 
        free(p);        //    释放原来的头节点 
        return x;        //    返回原来头节点里头的元素 
        
    }
    
} 

//    进入二叉树搜索特定节点
void CherkNode(BiTree T,int dat)
{
    if(T==NULL)
    {
        return;
    }    
    
    if(flag==1)        //    标记符flag 还是1时,表示还没找到要找的节点 
    {
        printf("入栈元素为: %d\n",T->data);
        PushStack(T->data);     //    入栈
    }
    if(T->data == dat)        //    已经在二叉树中遍历到要找的节点元素 
    {
        printf("元素找到,元素为: %d\n",T->data);
        flag = 0;
        return; 
    }
    
    CherkNode(T->lchild,dat);    //    遍历这个节点左子树,为NULL时才结束递归,返回上一级节点
    CherkNode(T->rchild,dat);    //    遍历这个节点的右子树,为NULL时返回上一级节点
    
    if(flag==1)        //    递归遍历二叉树每条路径中寻找,由于遍历一个节点 
    {                //    就会让元素入栈,以便将后面元素不是要找路径之中的元素,从栈中清除 
        printf("出栈元素: %d\n",T->data); 
        PopStack();    //    清除非要寻找路径上的栈中元素    
    }
} 
//    搜索路径 
void SearchPath(BiTree T,int data)
{
    int temp[30];    //    用来存最后找到的路径各个节点里头的数据 
    int i;
    flag = 1;        //    标记符 
    
    L = (Stack)malloc(sizeof(StackNode));    //    分配空间给指针 
    L->next = NULL;        //    让第一个节点指针指向NULL,最后也就是栈底指针 
    
    if(T==NULL)        //    空树 
    {
        return;
    }
    CherkNode(T,data);    //    搜索二叉树中要找的节点,进行入栈出栈操作 
    for(i=0;L->next;i++)
    {
        temp[i] = PopStack();    //    找到的路径元素逆序存放在数组temp[]中 
    } 
    printf("路径寻找成功,路径如下:\n");
    for(i--;i>=0;i--)
    {
        printf("%d ",temp[i]);
    }
}

int main() 
{
    printf("1.建立二叉树存储结构\n2.求二叉树的先序遍历序列\n3.求二叉树的中序遍历序列\n4.求二叉树的后序遍历序列\n5.求二叉树的层序遍历序列\n6.求根结点到指定结点的路径\n0.退出\n");
        BiTree T;
    printf("请输入要选择的功能:");
     setlocale(LC_ALL,"chs"); 
    int choose;
    scanf("%d",&choose);
    switch(choose)
    {
        case 1:{
                printf("请输入二叉树:"); 
                CreateBiTree(&T);
               }
        case 2:{
                  printf("先序遍历:");
                  PreOrder(T);
                  printf("\n");
               }
        case 3:{
                printf("中序遍历:");
                InOrder(T);
                  printf("\n");
               }
        case 4:{
                printf("后序遍历:");
                PostOrder(T);
                printf("\n");
        }
        case 5:{
                printf("层次遍历:");
                LevelOrder(T);
                printf("\n");
               }
        case 6:{BiTree T;                //    创建二叉树指针  
                int Node;
                printf("请输入第一个节点(输入-1表示该节点下无其他节点)\n");
                CreateBiTree(&T);
                printf("先序遍历如下:\n"); 
                PreOrder(T); 
                putchar('\n');
                printf("请输入你要找的特定节点:\n");
                scanf("%d",&Node);
                SearchPath(T,Node);        //    开始搜索节点
                return 0;
                }
        case 0:printf("感谢使用本软件!已正常退出,按任意键结束!\n");breakdefault:printf("无效操作"); 
    }
}


  • 写回答

2条回答 默认 最新

  • threenewbee 2023-06-06 10:41
    关注

    你怎么输入的,是先序遍历输入的么?调试下,看看输入的过程有没有死循环。

    评论

报告相同问题?

问题事件

  • 创建了问题 6月6日

悬赏问题

  • ¥15 phython如何实现以下功能?查找同一用户名的消费金额合并—
  • ¥15 孟德尔随机化怎样画共定位分析图
  • ¥18 模拟电路问题解答有偿速度
  • ¥15 CST仿真别人的模型结果仿真结果S参数完全不对
  • ¥15 误删注册表文件致win10无法开启
  • ¥15 请问在阿里云服务器中怎么利用数据库制作网站
  • ¥60 ESP32怎么烧录自启动程序
  • ¥50 html2canvas超出滚动条不显示
  • ¥15 java业务性能问题求解(sql,业务设计相关)
  • ¥15 52810 尾椎c三个a 写蓝牙地址