qq_58020818 2021-11-17 19:45 采纳率: 100%
浏览 72
已结题

C语言实现二叉树的建立,我的程序为什么运行不了


#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERROR -1
typedef int Status; 
typedef char TElemType;

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

//先函数声明 
Status CreateBiTree(BiTree &T);//创建
Status PreRootTraverse(BiTree T);//先根遍历 
Status InRootTraverse(BiTree T);//中根遍历 
Status PostRootTraverse(BiTree T);//后根遍历 
Status CopyTree(BiTree T1,BiTree T2);//复制 
Status CompareTree(BiTree T,BiTree T2);//比较
Status CountTree(BiTree T,int num);//求叶子结点个数
Status BiTreeDepth(BiTree T);//求深度 
Status TreeSearch(BiTree &T,char x);//查找x 


//主函数 
int main(){
    int s;
    TElemType x;
    BiTree T=NULL;
    BiTree T2=NULL;
    int num=0;
    
    //先建立一个菜单 
    while(1)
    {
        printf("-----------菜单------------------");
        printf("1.建立一棵二叉树\n");
        printf("2.复制二叉树\n");
        printf("3.判断两棵二叉树相等\n");
        printf("4.求二叉树的叶子结点个数\n");
        printf("5.求二叉树的深度\n");
        printf("6.查找二叉树中元素x\n");
        printf("7.退出");
        printf("---------------------------------");
        
        printf("请选择以上方式:"); 
        scanf("%d",&s);
        
        switch(s)
        {
        case 1: 
            printf("输入二叉树中的元素(#代表空值)"); 
            getchar();
                CreateBiTree(T);
            printf("先根遍历:");
                PreRootTraverse(T);
            printf("中根遍历:");
                InRootTraverse(T);
            printf("后根遍历:");
                PostRootTraverse(T);
                printf("\n"); 
            break;
            
        case 2:
                CopyTree(T,T2);
             printf("复制出的二叉树的后根遍历为:"); 
                 PostRootTraverse(T);
                 printf("\n"); 
             break; 
             
         case 3:
             if(CompareTree(T,T2)){
                     printf("这两棵树是相等的,复制操作成功");
             }else{
                 printf("这两棵树是不相等的,复制操作不成功");
             }
                printf("\n"); 
              break;
              
          case 4:
              printf("二叉树的叶子结点为:");
               CountTree(T,num);
                  printf("\n"); 
              break;
              
            case 5:
             printf("该二叉树的深度为:"); 
                BiTreeDepth(T);
            printf("\n");
            break;
            
          case 6:
              printf("请输入要查的元素x:");
              getchar(); 
              scanf("%c",&x);
              if(TreeSearch(T,x)){
                printf("查找成功");
              }else{
                printf("该二叉树中没有该元素:");
              }
              break;    
          
          case 7:
              printf("退出成功");
              return 0; 
    
              default:
              printf("ERROR");        
        }
    printf("\n");
    }
    return 0;
}

//之后其他函数
Status CreateBiTree(BiTree &T)//创建
{
    char ch;
    scanf("%c",&ch);
    getchar();
    if(ch=='#')
        T=NULL;
    else
    {
        if(!(T=(BiTree)malloc(sizeof(BiTNode))))
        return ERROR;
        T->data=ch;
        CreateBiTree(T->lchild);
        CreateBiTree(T->rchild);
    }
    return OK;
}

Status PreRootTraverse(BiTree T)//先根遍历 
{
    if(T)
    {
        printf("%c",T->data);
        PreRootTraverse(T->lchild);
        PreRootTraverse(T->rchild);
    }
    return OK;
}


Status InRootTraverse(BiTree T)//中根遍历 
{
    if(T)
    {
        PreRootTraverse(T->lchild);
        printf("%c",T->data);
        PreRootTraverse(T->rchild);
    }
    return OK;
}

Status PostRootTraverse(BiTree T)//后根遍历 
{
    if(T)
    {
        PreRootTraverse(T->lchild);
        PreRootTraverse(T->rchild);
        printf("%c",T->data);
    }
    return OK;
}

Status CopyTree(BiTree T1,BiTree T2)//复制 
{
    if(T1)
    {
        T2=(BiTree)malloc(sizeof)(sizeof(BiTNode));
        if(!T2)
        {
            return ERROR;
        }
        T2->data=T1->data;
        CopyTree(T1->lchild,T2->lchild);
        CopyTree(T1->rchild,T2->rchild);
    }
    else
        T2=NULL;
    return OK;
}

Status CompareTree(BiTree T,BiTree T2)//比较
{
    if(!T&&!T2)||(!T->rchild)
        return OK;    
    if(T&&T2)
    {
        if(T->data==T2->data)
        {
            if(CompareTree(T->lchild,T2->lchild))
                if(CompareTree(T->rchild,T2->rchild))
                {
                    return OK;
                }    
        } 
    }
    return OK;
}

Status CountTree(BiTree T,int num)//求叶子结点个数
{
    if(!T->lchild)&&(!T->rchild)
    {
        num++;
    }
        
    CountTree(T->lchild,num);
    CountTree(T->rchild,num);
    return num;
}

Status BiTreeDepth(BiTree T)//求深度 
{
    int depthLeft,depthRight,depthval;
    if(T!=NULL)
    {
        depthLeft=Depth(T->lchild);
        depthLeft=Depth(T->rchild);
        depthval=depthLeft>depthRight?depthLeft:depthRight+1;
    }
    else
    {
        depthval=0; 
    }
    return depthval;
}

Status TreeSearch(BiTree &T,char x)//查找x
{
    if(T)
        if(T->data==x)
            return OK;
        else
            if(TreeSearch(T->lchild,x)!=ERROR?TreeSearch(T->lchild,x):TreeSearch(T->lchild,x))
                return OK;
    return 0;
}

  • 写回答

2条回答 默认 最新

  • CSDN专家-link 2021-11-17 19:50
    关注

    运行不了是编译错误、程序崩溃、还是结果错误?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 11月17日
  • 已采纳回答 11月17日
  • 创建了问题 11月17日

悬赏问题

  • ¥15 如何使用SC92F8003固件库解析私有协议数据?
  • ¥15 如何在音频中嵌入字符串(水印)信息进行传递
  • ¥30 plc怎么以设计说明书申请软著
  • ¥15 硬盘识别不了,需要初始化,可我的数据怎么办
  • ¥15 lvm2被mask了,怎么unmask都没用(标签-ubuntu|关键词-apt)
  • ¥15 交叉注意力机制的残差问题
  • ¥15 微信小程序:渲染收货地址时页面不显示
  • ¥20 win7 64位DirectShow提示初始化失败如何解决?
  • ¥15 关于Java对接海康威视车牌识别一体机SDK是否需要固定外网的IP?
  • ¥15 Linux扩容时,格式化卡住了:vgdispaly查看卷组信息,没有输出