二叉树分段错误(核心已转储)

Binary Tree Segmentation fault (core dumped)

struct Tree{
    char string[30];
    int hmanyt;
    struct Tree * left;
    struct Tree * right;
};
typedef struct Tree * drzewo;
void printftree(drzewo* korzen)
{
    if((*korzen)->left != NULL)
        printftree(&((*korzen)->left));
    printf("%s(%d)\n",(*korzen)->string,(*korzen)->hmanyt);
    if(strcmp((*korzen)->string,"boril[=10=]")==0)
        (((*korzen)->right)->left)->left=NULL;
    if((*korzen)->right != NULL)
        printftree(&((*korzen)->right));
    return ;
}
void erease(drzewo* korzen)
{
    if((*korzen)->left==NULL && (*korzen)->right==NULL)
    {
        *korzen=NULL;
        free (*korzen);
        return ;
    }
    else
    {
        if((*korzen)->left !=NULL)
        {
            erease(&((*korzen)->left));
            (*korzen)->left=NULL;
            free((*korzen)->left);
        }
        if((*korzen)->right !=NULL)
        {
            erease(&((*korzen)->right));
            (*korzen)->right=NULL;
            free((*korzen)->right);
        }
    }
    *korzen=NULL;
    free(*korzen);
    return ;
}
void add(drzewo* korzen,char word[])
{
    while(*korzen!=NULL)
    {
        if(strcmp((*korzen)->string,word)==0)   {
            ((*korzen)->hmanyt)++;
            return; }
        else if(strcmp((*korzen)->string,word)<0)   {
            korzen=&((*korzen)->right); }
        else if(strcmp((*korzen)->string,word)>0)   {
            korzen=&((*korzen)->left);
                }
    }
    *korzen=(drzewo) malloc(sizeof(drzewo));
    strcpy(((*korzen)->string),word);
    printf("%p",(*korzen)->left);
    printf("%p\n",(*korzen)->right);
    (*korzen)->hmanyt=1;    
    return;
}
int main()
{
    drzewo korzen =NULL;
    char *words[10]={"alfabet","borixon","aaaaaa","zombie","bobas","kamil","agnieszka","kokos","zamach"};
    for(int i=0;i<9;i++)
        add(&korzen,words[i]);
    printf("test1\n");
    printftree(&korzen);
    printf("test");
    erease(&korzen);
    return 0;
}

所以这是我的二叉树实现。将 10 个单词加载到树中。可悲的是,在 'printing' 这棵树中,我遇到了一个核心转储的问题。我不知道为什么,但是其中一个结构 "has" (*korzen)->left 不是 NULL,我的函数想要访问它,并且核心转储出现了。添加两行后

if(strcmp((*korzen)->string,"boril[=11=]")==0)
    (((*korzen)->right)->left)->left=NULL;

它工作正常,但我不知道为什么我会遇到这个问题。另一个问题是,尽管有这样一行:

(*korzen)->hmanyt=1;

毕竟它没有这个值...(只有第一个词有 hmanyt==1)。非常感谢您的帮助。

NULL 分配给您想要 free 的指针是个坏主意。在函数中更改 *korzen=NULL;free(*korzen); 的位置 erease:

像这样调整函数 erease

void erease(drzewo* korzen)
{
    if ( *korzen == NULL )
        return;

    if( (*korzen)->left !=NULL )
    {
        erease(&((*korzen)->left)); // (*korzen)->left is freed in erease
    }
    if( (*korzen)->right !=NULL )
    {
        erease(&((*korzen)->right)); // (*korzen)->right is freed in erease
    }
    free(*korzen);
    *korzen=NULL;
    return;
}

如果您在树中插入一个新节点,则必须使用 NULL 初始化其子节点 (*korzen)->left(*korzen)->right。此外 drzewo 的类型是 struct Tree*,因此 sizeof(drzewo) 给出指针的大小而不是 struct Tree.

的大小
void add(drzewo* korzen,char word[])
{
    while( *korzen != NULL )
    {
        int cmp = strcmp( ( *korzen )->string, word );
        if ( cmp == 0 )
        {
            ((*korzen)->hmanyt)++;
            return;
        }
        else if( cmp<0 ) {
            korzen=&((*korzen)->right);
        }
        else if (cmp>0 ) {
            korzen=&((*korzen)->left);
        }
    }
    // allocate new node and initiialize
    *korzen=malloc(sizeof(struct Tree)); // allocat sizeof struct Tree ( not sizeof pointer to Tree) 
    ( *korzen )->left = NULL;  // <- left child is null
    ( *korzen )->right = NULL; // <- right child is null
    strcpy(((*korzen)->string),word);
    (*korzen)->hmanyt=1;    
    return;
}

最后你的函数 printftree:

void printftree(drzewo* korzen)
{
    if ( *korzen == NULL )
        return;
    if( (*korzen)->left != NULL)
        printftree(&((*korzen)->left));
    printf("%s(%d)\n",(*korzen)->string,(*korzen)->hmanyt);
    if((*korzen)->right != NULL)
        printftree(&((*korzen)->right));
    return ;
}