CSDN-Ada助手 2024-04-11 18:42 采纳率: 1.6%
浏览 6

这个代码哪里出错了?_(语言-c语言)

该问题来自社区帖: https://bbs.csdn.net/topics/618433329.为符合问答规范, 该问题经过ChatGPT优化
<html lang="en"><head><meta /><meta name="viewport" /><title>Optimized Code</title></head><body>

#include<stdio.h>
#include<stdlib.h>

#define BITREE_NODE_TYPE_ELEMENT char

typedef struct bi_tree_node
{
BITREE_NODE_TYPE_ELEMENT data;
struct bi_tree_node* LChild;
struct bi_tree_node* RChild;
}BiTree_Node, * BiTree;

void postOrder(BiTree root); //declare post-order traversal function
void inOrder(BiTree root); //declare in-order traversal function
void preOrder(BiTree root); //declare pre-order traversal function
void createBiTree(BiTree* bi_tree); //declare create binary tree function
void visit(BITREE_NODE_TYPE_ELEMENT data); //declare visit node data function

int main()
{
//test data: ABC**DE*G**F***
//pre-order: ABCDEGF
//in-order: CBEGDFA
//post-order: CGEFDBA
BiTree bi_tree = NULL;
puts("Please enter the node data of a binary tree in pre-order sequence, using '#' to represent null:");
createBiTree(&bi_tree);
printf("\nPre-order sequence:");
preOrder(bi_tree);
printf("\nIn-order sequence:");
inOrder(bi_tree);
printf("\nPost-order sequence:");
postOrder(bi_tree);
putchar('\n');
return 0;
}

//define visit node data function
void visit(BITREE_NODE_TYPE_ELEMENT data)
{
putchar(data);
}

//define create binary tree function
void createBiTree(BiTree* bi_tree)
{
char ch;
ch = getchar();
if (ch == '#')
*bi_tree = NULL;
else
{
*bi_tree = (BiTree)malloc(sizeof(BiTree_Node));
(*bi_tree)->data = ch;
createBiTree(&((*bi_tree)->LChild));
createBiTree(&((*bi_tree)->RChild));
}
}

//define pre-order traversal function
void preOrder(BiTree root)
//pre-order traversal of binary tree, root points to the root node of the binary tree or a subtree
{
if (root != NULL)
{
visit(root->data); //visit root node
preOrder(root->LChild); //pre-order traversal of left subtree
preOrder(root->RChild);//pre-order traversal of right subtree
}
}

//define in-order traversal function
void inOrder(BiTree root)
//in-order traversal of binary tree, root points to the root node of the binary tree or a subtree
{
if (root != NULL)
{
inOrder(root->LChild); //in-order traversal of left subtree
visit(root->data); //visit root node
inOrder(root->RChild); //in-order traversal of right subtree
}
}

//define post-order traversal function
void postOrder(BiTree root)
//post-order traversal of binary tree, root points to the root node of the binary tree or a subtree
{
if (root != NULL)
{
postOrder(root->LChild); //post-order traversal of left subtree
postOrder(root->RChild); //post-order traversal of right subtree
visit(root->data); //visit root node
}
}

</body></html>
  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-11 18:42
    关注

    引自免费微信小程序:皆我百晓生

    在给定的C语言代码中,没有明显的语法错误。但是,对于构建二叉树的逻辑,存在一些潜在的问题。为了使创建的二叉树符合预设的序列,我们需要修改createBiTree()函数。

    首先,让我们分析一下如何根据输入的预序遍历序列构建二叉树。假设我们有一个预序序列,例如 "ABCDE*GF***"。在这个例子中,每个字符代表一个节点,星号(*)表示空节点(NULL)。从左到右读取,第一个字符是根节点。然后,我们在剩余的序列中找到下一个非空节点作为左子树的根,再在其剩余部分找到下一个非空节点作为右子树的根,以此类推。

    下面是修改后的代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define BITREE_NODE_TYPE_ELEMENT char
    
    typedef struct bi_tree_node {
        BITREE_NODE_TYPE_ELEMENT data;
        struct bi_tree_node* LChild;
        struct bi_tree_node* RChild;
    } BiTree_Node, * BiTree;
    
    void postOrder(BiTree root);
    void inOrder(BiTree root);
    void preOrder(BiTree root);
    void createBiTree(BiTree* bi_tree, const char* input, int* index);
    
    void visit(BITREE_NODE_TYPE_ELEMENT data) {
        putchar(data);
    }
    
    BiTree createBinaryTree(const char* input) {
        BiTree root = NULL;
        createBiTree(&root, input, &input[0]);
        return root;
    }
    
    void createBiTree(BiTree* bi_tree, const char* input, int* index) {
        char ch = input[*index];
    
        if (ch == '*') {
            *bi_tree = NULL;
        } else {
            *bi_tree = (BiTree)malloc(sizeof(BiTree_Node));
            (*bi_tree)->data = ch;
            
            ++(*index);
            createBiTree(&((*bi_tree)->LChild), input, index);
            createBiTree(&((*bi_tree)->RChild), input, index);
        }
    }
    
    int main() {
        const char* testData = "ABC**DE*G**F***";
        BiTree bi_tree = createBinaryTree(testData);
    
        printf("\nPre-order sequence:");
        preOrder(bi_tree);
        printf("\nIn-order sequence:");
        inOrder(bi_tree);
        printf("\nPost-order sequence:");
        postOrder(bi_tree);
    
        putchar('\n');
        
        freeBiTree(bi_tree); // Don't forget to free memory after use
        return 0;
    }
    
    // Add this function to free the memory used by the binary tree
    void freeBiTree(BiTree root) {
        if (root != NULL) {
            freeBiTree(root->LChild);
            freeBiTree(root->RChild);
            free(root);
        }
    }
    

    这段代码中,我添加了一个新的函数createBinaryTree(const char* input),它接受一个包含预序遍历序列的字符串作为参数,并返回二叉树的根节点。同时,我也修改了createBiTree()函数,使其接受额外的一个指针参数,用于跟踪输入序列中的当前索引位置。这样,我们可以根据输入序列动态地构建二叉树。最后,我还添加了一个freeBiTree(BiTree root)函数,用于释放分配给二叉树节点的内存。

    现在,这个程序应该可以正确地根据预设的预序遍历序列构建二叉树,并进行中序、后序遍历。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月11日

悬赏问题

  • ¥15 怎么改成输入一个要删除的数后现实剩余的数再输入一个删除的数再现实剩余的数用yes表示继续no结束程序
  • ¥15 在启动roslaunch时出现如下问题
  • ¥15 汇编语言实现加减法计算器的功能
  • ¥20 关于多单片机模块化的一些问题
  • ¥30 seata使用出现报错,其他服务找不到seata
  • ¥35 引用csv数据文件(4列1800行),通过高斯-赛德尔法拟合曲线,在选取(每五十点取1点)数据,求该数据点的曲率中心。
  • ¥20 程序只发送0X01,串口助手显示不正确,配置看了没有问题115200-8-1-no,如何解决?
  • ¥15 Google speech command 数据集获取
  • ¥15 vue3+element-plus页面崩溃
  • ¥15 像这种代码要怎么跑起来?