Этот основной алгоритм двоичного дерева поиска вызывает ошибку сегментации: ошибка 11 - PullRequest
0 голосов
/ 30 апреля 2019

Это простое двоичное дерево поиска вызывает segmentation fault:11.

Я не могу понять, какой пункт кода создает эту проблему.

Почему происходит это segmentation fault:11?

Рекурсивная функция binarySerach не может быть неправильной, потому что она из учебника.

Так что я думаю, что у меня есть значительное невежество в определении дерева, может быть что-то о malloc.

Правильно ли определить treePointer таким образом?

Я полностью проклят с ошибкой segmentation fault:11.

Я хочу знать, когда возникнет эта ошибка.

PS Извините за мой плохой английский.


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

typedef struct element
{
        int key;
} element;

typedef struct node *treePointer;
typedef struct node
{
        element data;
        treePointer leftChild;
        treePointer rightChild;
} node;

element* binarySearch(treePointer tree, int key);

int main(void)
{
        treePointer *a;

        for(int i = 0; i < 10; i++)
        {
                a[i] = malloc(sizeof(node));
                a[i] -> data.key = i * 10;

                a[i] -> leftChild = NULL;
                a[i] -> rightChild = NULL;

        }
        a[0] -> leftChild = a[1];
        a[0] -> rightChild = a[2];

        a[1] -> leftChild = a[3];
        a[1] -> rightChild = a[4];

        a[2] -> leftChild = a[5];
        a[2] -> rightChild = a[6];

        a[3] -> leftChild = a[7];
        a[3] -> rightChild = a[8];

        a[4] -> leftChild = a[9];


        element* A = binarySearch(a[0], 30);
        printf("%d\n", A -> key);

        for(int i = 0; i < 10; i++)
        {
                free(a[i]);
        }
}

element* binarySearch(treePointer tree, int key)
{
        if(!tree) return NULL;
        if(key == tree -> data.key) return &(tree -> data);
        if(key < tree -> data.key)
                return binarySearch(tree -> leftChild, key);
        return binarySearch(tree -> rightChild, key);

}

1 Ответ

0 голосов
/ 30 апреля 2019

Вам также необходимо выделить память для a. Измените свою декларацию на:

treePointer *a = malloc(10 * sizeof(treePointer));

И позвоните free(a); в конце. Кроме того, он не находит ключ, поэтому он возвращает NULL, что вызывает неопределенное поведение на printf("%d\n", A->key);. Но это потому, что ваш BST настроен неправильно. Корневой элемент имеет ключ 0, а два его потомка имеют ключи 10 и 20, которые не могут быть правильными.

...