C Удалить узел из BST без ввода ключа - PullRequest
0 голосов
/ 10 декабря 2018

Я знаю, как удалить узел традиционным способом, используя ключ.Однако мне нужно удалить узел, основанный на другой переменной (имя), затем найти ключ, соответствующий этой переменной (имя), и удалить все узлы, которые содержат эту переменную (имя).Предположим, что мои функции insert / inorder / FindMin и #include присутствуют в моем коде.Вот мой код:

int totalStud;

struct evil {
    int key;
    char name[21];
    struct evil *right;
    struct evil *left;
};



struct evil *Delete(struct evil* root, int key){

    if (root == NULL){
        return root;
    }else if(key<root->key){
        root->left = Delete(root->left, key);
    }else if(key>root->key){
        root->right = Delete(root->right, key);
    }else{
        if (root->left == NULL){
            struct evil *temp = root->right;
            free(temp);
            return temp;
        }else if(root->right == NULL){
            struct evil *temp =  root->left;
            free(temp);
            return temp;
        }
        struct evil *temp = FindMin(root->right);
        root->key = temp->key;
        root->right = Delete(root->right,temp->key);

    }
}

struct evil *DelFinder(struct evil* root, char name[21]){ //I tried several things here, but I don't know what to do here to make it work.
    if (root == NULL){
        return root;
    }
    if(strcmp(root->name, name)==0){
        root = Delete(root, root->key);
        return root;
    }else{
        if (root->left != NULL){
            DelFinder(root->left,name);
        }
        if(root->right != NULL){
            DelFinder(root->right,name);
        }
    }
    return root;
}



int main(void){
    struct evil* root = NULL;

    totalStud = 5;
    root = Insert(root, 1015, "Jack");
    root = Insert(root, 1002, "Bob");
    root = Insert(root, 1085, "Sow");
    root = Insert(root, 1088, "Knack");
    root = Insert(root, 1099, "Sow");

    inorder(root); //all the elements in the BST before deleting Sow

    for (totalStud = 5; totalStud !=-1; totalStud--){
        root = DelFinder(root, "Sow");
    }
    inorder(root); //all the elemennts in BST after deleting Sow

}

Я знаю, что это проблема с функцией DelFinder, но я не знаю лучший способ написать это, чтобы заставить его работать.Я пытаюсь удалить элемент, не используя ключ напрямую.ТАКЖЕ, если бы я попросил пользовательский ввод вместо того, чтобы делать предварительные настройки в основной функции, что было бы лучшим способом предотвратить создание дублирующих клавиш?как попросить пользователя поставить другой ключ из-за того, что он уже существует?(дубликаты имен в порядке).

...