N—E—E 2021-11-02 20:07 采纳率: 59.5%
浏览 62
已结题

这个二叉搜索树哪里错了?

报错那句不知道问题在哪,调试之后发现在main函数第二个insert哪里出错


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

typedef int ElementType;
struct BST;
typedef struct BST* Tree;
typedef struct BST* Position;

void MakeEmpty(Tree T);
Position Find(Tree T, ElementType X);
Position FindMin(Tree T);
Position FindMax(Tree T);
Tree Insert(Tree T, ElementType X);
Tree Delete(Tree T, ElementType X);
void PrintBST(Tree T);








struct BST
{
    Position LeftChild;
    Position RightChild;
    ElementType Value;
};



#include "BST.h"

void MakeEmpty(Tree T) {
    if (T != NULL)
    {
        MakeEmpty(T->LeftChild);
        MakeEmpty(T->RightChild);
        free(T);
    }
}
Position Find(Tree T, ElementType X) {
    if (T == NULL)
        return NULL;
    else if (X < T->Value)
        return Find(T->LeftChild, X);
    else if (X > T->RightChild)
        return Find(T->RightChild, X);
    else
        return T;
}
Position FindMin(Tree T) {
    if (!T->LeftChild)
        return T;
    else
        return FindMin(T->LeftChild);
}
Position FindMax(Tree T) {
    while (T->RightChild)
        T = T->RightChild;
    return T;
}
Tree Insert(Tree T, ElementType X) {
    if (!T)
    {
        T = (Tree)malloc(sizeof(struct BST));
        T->Value = X;
        T->LeftChild = T->RightChild = NULL;
    }

    else if (X < T->Value)
        T->LeftChild = Insert(T->LeftChild,X);
    else if (X > T->Value)
        T->RightChild = Insert(T->RightChild,X);
    return T;


}
Tree Delete(Tree T, ElementType X) {
    Position tmpcell;
    if (T == NULL)
        return NULL;
    else if (X < T->Value)
        T->LeftChild = Delete(T->LeftChild, X);
    else if (X > T->Value)
        T->RightChild = Delete(T->RightChild, X);
    else if (T->LeftChild && T->RightChild)
    {
        tmpcell = FindMin(T->RightChild);
        T->Value = tmpcell->Value;
        Delete(tmpcell,X);
    }
    else
    {
        tmpcell = T;
        if (T->LeftChild == NULL)
            T = T->RightChild;
        else
        {
            T = T->LeftChild;
        }
        free(tmpcell);
    }
    return T;
}
void PrintBST(Tree T) {
    if (!T)
        return;
    else
    {
        printf("%d", T->Value);
        PrintBST(T->LeftChild);
        PrintBST(T->RightChild);
    }
}


```c
#include "BST.h"

int main()
{
    Tree T = malloc(sizeof(struct BST));
    Insert(T, 7);
    Insert(T, 3);
    Insert(T, 8);
    Insert(T, 2);
    Insert(T, 5);
    PrintBST(T);
}

img

  • 写回答

1条回答 默认 最新

  • Autumn0923 2021-11-02 23:13
    关注

    兄弟,我看了一下你的插入函数,问题就是段错误,你看你初始化的时候,你没有把T的左右孩子初始化为空值,所以你看你这个插入函数刚进来的时候,你的左右孩子的指向了一片野地址所以,当你的根节点进入插入函数之后判断不为空,这个时候你输入的值x肯定是大于根节点的值的,所以就会递归调用你的右孩子值,但是右孩子这个时候又指向野地址怎么判断它的值和value的大小呢?你看

    img

    所以我在主函数里面将根节点的左右孩子都初始化为NULL这样在递归调用到右孩子的时候他就会判断到右孩子是null然后就给他开辟空间再赋值,这样就不会发生段错误了

    img

    当然这样只是有结果,并不能说明你这个树建立好了,你可以看到第一行输出的是一串乱码,这是因为你的根节点并没有赋初值,所以当你递归调用的时候,你输入的值实际上不知道跟哪个值在比较,所以就会出现第一行的乱码,所以你应该再解决一下你的根节点的问题,你可以在进入函数之后判断他是不是根节点,或者对根节点单独操作,还有一个就是我最开始觉的就算是解决了上述问题你这个BST建立的还是有问题,你想这个搜索树的建立怎么能简单的递归呢,那我给数据的时候随便给,那插进去不是乱了吗,后来一想,这不是插入排序么,你每次进来都是把你的数放到合适的位置才停,肯定乱不了,回答你的问题,我确实学到了不少东西啊,哈哈哈,当然我还没改好,等我改好了我把我的代码贴到下面供你参考,你先看着改改
    希望以后能有机会跟你一起探讨C语言和数据结构

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月12日
  • 已采纳回答 11月4日
  • 创建了问题 11月2日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程