Что плохого в этой функции для удаления узла из BST? - PullRequest
0 голосов
/ 02 апреля 2020

Я просто хочу удалить узел из BST, и это дает мне ошибку, что новый не определен. ADT выглядит так:

typedef struct BSTNode *BSTree;
struct BSTNode {
    int value;
    BSTree left;
    BSTree right;
};

 BSTree Delete(BSTree t, int item) {
        if (item < t->value) {
            t->left = Delete(t->left, item);
        } else if (item > t->value) {
            t->right = Delete(t->right, item);
        } else {
            // deleting item
            if (t->left == NULL && t->right == NULL) {
                BSTree new = NULL;
            } else if (t->left == NULL) {
                BSTree new = t->right;
            } else if (t->right == NULL) {
                BSTree new = t->left;
           // } else {
                //BSTree new = joinTrees(t->left, t->right);
            }

            free(t);
            t = new;
        }

1 Ответ

0 голосов
/ 02 апреля 2020

Проблема в том, что вы объявляете несколько переменных, которые существуют только внутри каждого содержащего условного блока. Объявите переменную в верхней части функции или в верхней части блока else. Затем установите эту же переменную в каждом условном блоке кода.

BSTree Delete(BSTree t, int item) {
    BSTree new_item;
    if (item < t->value) {
        t->left = Delete(t->left, item);
    } else if (item > t->value) {
        t->right = Delete(t->right, item);
    } else {
        // deleting item
        if (t->left == NULL && t->right == NULL) {
            new_item = NULL;
        } else if (t->left == NULL) {
            new_item = t->right;
        } else if (t->right == NULL) {
            new_item = t->left;
       // } else {
            //BSTree new = joinTrees(t->left, t->right);
        }

        free(t);
        t = new_item;
    }
...