Я пытаюсь реализовать дерево AVL только ради обучения. Мне удалось сделать ввод, но я застрял в деле удаления. У меня проблема с удалением листового узла (однопользовательский случай работает просто отлично). Проблема в том, что когда я удаляю узел, он не стирается из BST, вместо этого его значение просто превращается в 0, поэтому дерево никогда не выходит из равновесия при удалении узла. То, что я в основном делаю, это если я столкнулся с узлом без детей, я просто освобожу его. Вот код функции (без повторной балансировки части):Удаление узла листа BST
node_t *Delete (node_t *root, int num){
if (!root){
printf ("Not Found\n");
return root;
}
//=======Search for the Element=============
if (num > root->data)
Delete (root->right , num);
else if (num < root->data)
Delete (root->left , num);
//======Delete element==============
else if (num == root->data){
if (root->right && root->left){ //two child case
node_t *auxP = root->right;
while (auxP->left) //finding the successor
auxP=auxP->left;
root->data = auxP->data;
root->right = Delete (root->right, auxP->data);
}
else{ //one or no child
if (!root->right && !root->left){ // no childs
free(root);
}
else{ //one child
node_t *auxP = (root->right ? root->right : root->left);
*root=*auxP;
free(auxP);
}
}
}
return root;
}
Если у меня есть дерево, как это:
10
/\
5 15
/\ \
2 6 17
и я стараюсь, чтобы удалить 6, он заканчивается как этот
10
/\
5 15
/\ \
2 0 17
Это может быть очевидная ошибка, но я не могу ее найти. Любое объяснение того, почему он не работает, будет с благодарностью.
Просьба понять, как это работает: http://geeksquiz.com/binary-search-tree-set-2-delete/ –