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

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日

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?