鱼C论坛

 找回密码
 立即注册
查看: 1012|回复: 14

[已解决]求大佬看看

[复制链接]
发表于 2022-12-23 14:07:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>

typedef char bitreeElemType;
typedef struct BiNode                                        //定义二叉链表
{
        bitreeElemType data;
        struct BiNode* lchild, * rchild;
}BiNode,*BiTree;

int leaf = 0;

BiTree creat(int n, char qian[], char zhong[]);                //先序中序恢复二叉树 
void pre_traverse_Bitree(BiTree T);                        //先序遍历
void in_traverse_Bitree(BiTree T);                        //中序遍历
void post_traverse_Bitree(BiTree T);                //后序遍历
int Gethight_Bitree(BiTree T);                                //求高度
int Getleaf_Bitree(BiTree T);                                //求叶子数

BiTree creat(int n, char qian[], char zhong[])
{
        int i;
        BiTree root;
        if (n == 0)
        {
                return NULL;
        }
        root = (BiTree)malloc(sizeof(BiNode));
        root->data = qian[0];//根节点一定是先序排列的第一个
        for (i = 0; i < n; i++)
        {
                if (zhong[i] == qian[0])//找到中序序列中与根节点相等的位置
                {
                        break;
                }
        }
        root->lchild = creat(i, qian + 1, zhong);//逐步遍历
        root->rchild = creat(n - i - 1, qian + 1 + i, zhong + 1 + i);
        return root;
}

void pre_traverse_Bitree(BiTree T)
{
        if (!T)
                return;
        printf("%c", T->data);
        pre_traverse_Bitree(T->lchild);
        pre_traverse_Bitree(T->rchild);
}

void in_traverse_Bitree(BiTree T)
{
        if (!T)
                return;
        in_traverse_Bitree(T->lchild);
        printf("%c", T->data);
        in_traverse_Bitree(T->rchild);
}

void post_traverse_Bitree(BiTree T)
{
        if (!T)
                return;
        post_traverse_Bitree(T->lchild);
        post_traverse_Bitree(T->rchild);
        printf("%c", T->data);
}

int Gethight_Bitree(BiTree T)
{
        if (!T)
                return 0;
        return Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild) ? Gethight_Bitree(T->lchild) + 1 
                                                                                                                                   : Gethight_Bitree(T->rchild) + 1;
}

int Getleaf_Bitree(BiTree T)
{
        if (!T)
                return 0;
        if (T->lchild == NULL && T->rchild == NULL)
                return ++leaf;
        Getleaf_Bitree(T->lchild);
        Getleaf_Bitree(T->rchild);
}


int main()
{
        int n;
        printf("请输入节点数\n");
        scanf("%d", &n);
        char qian[100], zhong[100];
        printf("请输入先序\n");
        for(int i=0;i<n;i++)
        {
                scanf("%c",&qian[i]);
        }
        printf("请输入中序\n");
                for(int i=0;i<n;i++)
        {
                scanf("%c",&zhong[i]);
        }
        BiTree T;
        T = creat(n,qian,zhong);
        printf("先序遍历为: \n");
        pre_traverse_Bitree(T);
        printf("该树高度为: %d\n", Gethight_Bitree(T));
        printf("该树有%d个叶子\n", Getleaf_Bitree(T));

        return 0;
}


先序中序恢复出来的二叉树怎么写才能成为其他函数的参数啊?我的运行结果到把中序敲上去就直接完了。问老师老师一点有用的都不说。求回复
最佳答案
2022-12-23 16:04:36
程序是调试出来的,要调试程序的说
#include <stdio.h>
#include <stdlib.h>

typedef char bitreeElemType;
typedef struct BiNode //定义二叉链表
{
    bitreeElemType data;
    struct BiNode *lchild, *rchild;
} BiNode, *BiTree;

//int leaf = 0;

BiTree creat(int n, char qian[], char zhong[]); //先序中序恢复二叉树
void pre_traverse_Bitree(BiTree T);             //先序遍历
void in_traverse_Bitree(BiTree T);              //中序遍历
void post_traverse_Bitree(BiTree T);            //后序遍历
int Gethight_Bitree(BiTree T);                  //求高度
int Getleaf_Bitree(BiTree T);                   //求叶子数

BiTree creat(int n, char qian[], char zhong[]) {
    int i;
    BiTree root;
    if(n == 0) {
        return NULL;
    }
    root = (BiTree)malloc(sizeof(BiNode));
    root->data = qian[0]; //根节点一定是先序排列的第一个
    for(i = 0; i < n; i++) {
        if(zhong[i] == qian[0]) //找到中序序列中与根节点相等的位置
        {
            break;
        }
    }
    root->lchild = creat(i, qian + 1, zhong); //逐步遍历
    root->rchild = creat(n - i - 1, qian + 1 + i, zhong + 1 + i);
    return root;
}

void pre_traverse_Bitree(BiTree T) {
    if(!T)
        return;
    printf("%c", T->data);
    pre_traverse_Bitree(T->lchild);
    pre_traverse_Bitree(T->rchild);
}

void in_traverse_Bitree(BiTree T) {
    if(!T)
        return;
    in_traverse_Bitree(T->lchild);
    printf("%c", T->data);
    in_traverse_Bitree(T->rchild);
}

void post_traverse_Bitree(BiTree T) {
    if(!T)
        return;
    post_traverse_Bitree(T->lchild);
    post_traverse_Bitree(T->rchild);
    printf("%c", T->data);
}

int Gethight_Bitree(BiTree T) {
    if(!T) return 0;
    /*
    return Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild)
               ? Gethight_Bitree(T->lchild) + 1
               : Gethight_Bitree(T->rchild) + 1;
   */
    return (Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild)
           ? Gethight_Bitree(T->lchild)
           : Gethight_Bitree(T->rchild)) + 1;
}

/*
int Getleaf_Bitree(BiTree T) {
    if(!T)
        return 0;
    if(T->lchild == NULL && T->rchild == NULL)
        return ++leaf;
    Getleaf_Bitree(T->lchild);
    Getleaf_Bitree(T->rchild);

    // return ???
}
*/

int Getleaf_Bitree(BiTree T) {
    if(!T) return 0;
    if(T->lchild == NULL && T->rchild == NULL) return 1;
    return Getleaf_Bitree(T->lchild) + Getleaf_Bitree(T->rchild);
}

// 求你们了,释放一下内存吧
// 知道windows为什么连一个月也运行不了吗?
// 就是因为你们写程序,不释放内存
void tree_free(BiTree T) {
    if(!T) return;
    tree_free(T->lchild);
    tree_free(T->rchild);
    free(T);
}

int main() {
    int n;
    printf("请输入节点数\n");
    scanf("%d", &n);
    char qian[100], zhong[100];
    printf("请输入先序\n");




    // *************************
    getchar();  // '\n'
    // *************************



    for(int i = 0; i < n; i++) {
        scanf("%c", &qian[i]);
    }
    printf("请输入中序\n");




    // *************************
    getchar();  // '\n'
    // *************************



    for(int i = 0; i < n; i++) {
        scanf("%c", &zhong[i]);
    }
    BiTree T;
    T = creat(n, qian, zhong);
    printf("先序遍历为: \n");
    pre_traverse_Bitree(T);
    printf("该树高度为: %d\n", Gethight_Bitree(T));
    printf("该树有%d个叶子\n", Getleaf_Bitree(T));

    tree_free(T);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-12-23 14:16:26 | 显示全部楼层
先序中序  恢复出来 的二叉树怎么写才能成为其他函数的参数啊?

恢复出来?什么意思?
恢复出来的二叉树?
怎么个恢复出来?

看不懂你的问题,重新组织一下语言,把你的问题说清楚
你的老师不理你,大概是因为他看不懂你在说什么吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-23 14:23:06 | 显示全部楼层
人造人 发表于 2022-12-23 14:16
先序中序  恢复出来 的二叉树怎么写才能成为其他函数的参数啊?

恢复出来?什么意思?

题目是让用先序和中序先把二叉树恢复出来,再进行遍历求叶子和高度这些操作。
我问的意思就是用先序和中序恢复出来的二叉树怎么进行遍历那些操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-23 14:39:34 | 显示全部楼层
ZXPoo 发表于 2022-12-23 14:23
题目是让用先序和中序先把二叉树恢复出来,再进行遍历求叶子和高度这些操作。
我问的意思就是用先序和中 ...

第108行不就是在遍历么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-23 14:41:05 | 显示全部楼层
人造人 发表于 2022-12-23 14:39
第108行不就是在遍历么?

但是运行窗口运行到把中序输入进去就结束了。
不知道是哪没写对。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-23 16:04:36 | 显示全部楼层    本楼为最佳答案   
程序是调试出来的,要调试程序的说
#include <stdio.h>
#include <stdlib.h>

typedef char bitreeElemType;
typedef struct BiNode //定义二叉链表
{
    bitreeElemType data;
    struct BiNode *lchild, *rchild;
} BiNode, *BiTree;

//int leaf = 0;

BiTree creat(int n, char qian[], char zhong[]); //先序中序恢复二叉树
void pre_traverse_Bitree(BiTree T);             //先序遍历
void in_traverse_Bitree(BiTree T);              //中序遍历
void post_traverse_Bitree(BiTree T);            //后序遍历
int Gethight_Bitree(BiTree T);                  //求高度
int Getleaf_Bitree(BiTree T);                   //求叶子数

BiTree creat(int n, char qian[], char zhong[]) {
    int i;
    BiTree root;
    if(n == 0) {
        return NULL;
    }
    root = (BiTree)malloc(sizeof(BiNode));
    root->data = qian[0]; //根节点一定是先序排列的第一个
    for(i = 0; i < n; i++) {
        if(zhong[i] == qian[0]) //找到中序序列中与根节点相等的位置
        {
            break;
        }
    }
    root->lchild = creat(i, qian + 1, zhong); //逐步遍历
    root->rchild = creat(n - i - 1, qian + 1 + i, zhong + 1 + i);
    return root;
}

void pre_traverse_Bitree(BiTree T) {
    if(!T)
        return;
    printf("%c", T->data);
    pre_traverse_Bitree(T->lchild);
    pre_traverse_Bitree(T->rchild);
}

void in_traverse_Bitree(BiTree T) {
    if(!T)
        return;
    in_traverse_Bitree(T->lchild);
    printf("%c", T->data);
    in_traverse_Bitree(T->rchild);
}

void post_traverse_Bitree(BiTree T) {
    if(!T)
        return;
    post_traverse_Bitree(T->lchild);
    post_traverse_Bitree(T->rchild);
    printf("%c", T->data);
}

int Gethight_Bitree(BiTree T) {
    if(!T) return 0;
    /*
    return Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild)
               ? Gethight_Bitree(T->lchild) + 1
               : Gethight_Bitree(T->rchild) + 1;
   */
    return (Gethight_Bitree(T->lchild) > Gethight_Bitree(T->rchild)
           ? Gethight_Bitree(T->lchild)
           : Gethight_Bitree(T->rchild)) + 1;
}

/*
int Getleaf_Bitree(BiTree T) {
    if(!T)
        return 0;
    if(T->lchild == NULL && T->rchild == NULL)
        return ++leaf;
    Getleaf_Bitree(T->lchild);
    Getleaf_Bitree(T->rchild);

    // return ???
}
*/

int Getleaf_Bitree(BiTree T) {
    if(!T) return 0;
    if(T->lchild == NULL && T->rchild == NULL) return 1;
    return Getleaf_Bitree(T->lchild) + Getleaf_Bitree(T->rchild);
}

// 求你们了,释放一下内存吧
// 知道windows为什么连一个月也运行不了吗?
// 就是因为你们写程序,不释放内存
void tree_free(BiTree T) {
    if(!T) return;
    tree_free(T->lchild);
    tree_free(T->rchild);
    free(T);
}

int main() {
    int n;
    printf("请输入节点数\n");
    scanf("%d", &n);
    char qian[100], zhong[100];
    printf("请输入先序\n");




    // *************************
    getchar();  // '\n'
    // *************************



    for(int i = 0; i < n; i++) {
        scanf("%c", &qian[i]);
    }
    printf("请输入中序\n");




    // *************************
    getchar();  // '\n'
    // *************************



    for(int i = 0; i < n; i++) {
        scanf("%c", &zhong[i]);
    }
    BiTree T;
    T = creat(n, qian, zhong);
    printf("先序遍历为: \n");
    pre_traverse_Bitree(T);
    printf("该树高度为: %d\n", Gethight_Bitree(T));
    printf("该树有%d个叶子\n", Getleaf_Bitree(T));

    tree_free(T);

    return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-23 16:08:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-23 16:28:45 | 显示全部楼层
人造人 发表于 2022-12-23 16:04
程序是调试出来的,要调试程序的说

所以之前运行失败是内存的原因吗?
那个tree_free函数是释放内存的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-23 16:32:38 | 显示全部楼层
ZXPoo 发表于 2022-12-23 16:28
所以之前运行失败是内存的原因吗?
那个tree_free函数是释放内存的吗

还有其他问题,你看代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-23 16:37:03 | 显示全部楼层
人造人 发表于 2022-12-23 16:32
还有其他问题,你看代码

求叶子和高度写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-23 16:38:37 | 显示全部楼层
ZXPoo 发表于 2022-12-23 16:37
求叶子和高度写错了

什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-23 16:40:39 | 显示全部楼层
ZXPoo 发表于 2022-12-23 16:37
求叶子和高度写错了

你指的是,你发现了你写的代码中,这两个地方的错误
还是说,我给你改的代码中,这两个地方改错了

说话说清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-23 16:40:42 | 显示全部楼层

求叶子和高度的代码我写错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-12-23 16:40:58 | 显示全部楼层
ZXPoo 发表于 2022-12-23 16:40
求叶子和高度的代码我写错了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-12-23 16:43:05 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 11:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表