N—E—E 2021-10-22 18:29 采纳率: 59.5%
浏览 67
已结题

这样的中序遍历树为什么出现错误?

启动调试直接显示segmentation fault了,是这个递归写的不对吗

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

struct Node;
typedef char ElementType;
typedef struct Node *Position;
typedef struct Node *Tree;

Tree Initialize();
void InsertLeft(Position N,ElementType value);
void InsertRight(Position N,ElementType value);
bool IsLeaf(Position N);
void SetValue(Position N,ElementType value);
void MiddleScan(Position N);







struct Node
{
    ElementType value;
    Position LeftChild;
    Position RightChild;
};


```c
#include "BinaryTree.h"

Tree Initialize()
{
    Tree T = (Tree)malloc(sizeof(struct Node));
    T->LeftChild = NULL;
    T->RightChild = NULL;
    T->value = ' ';

    return  T;
}
void InsertLeft(Position N,ElementType value)
{
    Position New;
    if (N->LeftChild)
        N->value = value;
    else
        New = malloc(sizeof(struct Node));
        New->RightChild = New->LeftChild =NULL;
        New->value = value;
        N->LeftChild = New;

}
void InsertRight(Position N,ElementType value)
{
    Position New;
    if (N->RightChild)
        N->value = value;
    else
        New = malloc(sizeof(struct Node));
        New->RightChild = New->LeftChild =NULL;
        New->value = value;
        N->RightChild = New;
}
bool IsLeaf(Position N)
{
    return (N->LeftChild || N->RightChild);
}
void SetValue(Position N,ElementType value)
{
    N->value = value;
}
void MiddleScan(Tree N)
{
    if (N->LeftChild == NULL && N->RightChild == NULL)
        printf("%c",N->value);
    else
        MiddleScan(N->LeftChild);
        printf("%c",N->value);
        MiddleScan(N->RightChild);
        
}



int main()
{
    Tree T0 = Initialize();
    SetValue(T0,'a');
    InsertLeft(T0,'b');
    InsertRight(T0,'c');
    MiddleScan(T0);
    system("pause");
    return 0;
}

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/025215898436183.png "=600 #left")
  • 写回答

2条回答 默认 最新

  • Autumn0923 2021-10-23 00:36
    关注

    兄弟,我看了你的代码,你看你的中序遍历函数:

    void MiddleScan(Tree N)
    {
        if (N->LeftChild == NULL && N->RightChild == NULL)
            printf("%c",N->value);
        else
            MiddleScan(N->LeftChild);
            printf("%c",N->value);
            MiddleScan(N->RightChild);
    }
    

    可以看懂你的本意是好的,估计是像判断这个节点是不是根节点,如果是根节点那么他的左右孩子应该都没有,然后打印这个节点的值,这当然没有什么问题,但是问题是进入这个函数的结点你有没有为他分配空间呢?,如果没有给他分配空间,那为什么他会有左孩子和右孩子呢?对不?然后你的主函数里输入了一个左孩子和一个右孩子,然后当第一次执行这个函数的时候,根节点进来然后他的左右孩子不为空,接下来就是把他的左孩子作为实参递归一遍,进来之后,判断他的左右子树都空,所以打印这个值 b,然后最让人头疼的来了,你这else后面妹打括号啊!!!!!妹打括号啊!!!!让我想半天[捂脸],然后你看,他又打了一遍 b,然后他又要执行一下把这个 b 节点的右孩子递归一下,那这个时候这个右孩子是NULL对不,那怎么递归嘞,所以,你的逻辑毫无问题,但是败给了这个书写习惯,哈哈哈,希望你以后要注意

    img

    结果你看一下,上一个兄弟说的方法也很好,我替你跑了一下

    img

    当然我看你是用一级指针建立的树,今天我看了一下用二级指针建立的数,欢迎你来跟我探讨!

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

报告相同问题?

问题事件

  • 系统已结题 11月6日
  • 已采纳回答 10月29日
  • 创建了问题 10月22日

悬赏问题

  • ¥15 如何提取csv文件中需要的列,将其整合为一篇完整文档,并进行jieba分词(语言-python)
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键
  • ¥15 将二维数组,按照假设的规定,如0/1/0 == "4",把对应列位置写成一个字符并打印输出该字符
  • ¥15 NX MCD仿真与博途通讯不了啥情况
  • ¥15 win11家庭中文版安装docker遇到Hyper-V启用失败解决办法整理
  • ¥15 gradio的web端页面格式不对的问题
  • ¥15 求大家看看Nonce如何配置
  • ¥15 Matlab怎么求解含参的二重积分?