Top.Mail.Ru
Ответы

Вопрос по программе, си.

Программа бинарного дерева. Функция удаления удаляет все хорошо, кроме корня дерева. Корень дерева не удаляется, как я не пробовал. Помогите плиз. Функция удаления delete. #define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
typedef int T;

#define CMP_EQ(a, b) ((a) == (b))
#define CMP_LT(a, b) ((a) < (b))
#define CMP_GT(a, b) ((a) > (b))

typedef struct Node {
T data;
struct Node *left;
struct Node *right;
struct Node *parent;
} Node;
Node* getFreeNode(T value, Node *parent) {
Node* tmp = (Node*)malloc(sizeof(Node));
tmp->left = tmp->right = NULL;
tmp->data = value;
tmp->parent = parent;
return tmp;
}
void insert(Node **head, int value) {
Node *tmp = NULL;
Node *ins = NULL;
if (*head == NULL) {
*head = getFreeNode(value, NULL);
return;
}

tmp = *head;
while (tmp) {
if (CMP_GT(value, tmp->data)) {
if (tmp->right) {
tmp = tmp->right;
continue;
}
else {
tmp->right = getFreeNode(value, tmp);
return;
}
}
else if (CMP_LT(value, tmp->data)) {
if (tmp->left) {
tmp = tmp->left;
continue;
}
else {
tmp->left = getFreeNode(value, tmp);
return;
}
}
else {
exit(2);
}
}
}
Node* findMinNode(Node *root) {
while (root->left) {
root = root->left;
}
return root;
}

Node* findMaxNode(Node *root) {
while (root->right) {
root = root->right;
}
return root;
}
Node *getNodeByValue(Node *root, T value) {
while (root) {
if (CMP_GT(root->data, value)) {
root = root->left;
continue;
}
else if (CMP_LT(root->data, value)) {
root = root->right;
continue;
}
else {
return "TRUE";
}
}
return "FALSE";
}
Node* minimum(Node *root) {
if (root->left == NULL)
return root;
return minimum(root->left);
}
Node* maximum(Node *root) {
if (root->right == NULL)
return root;
return minimum(root->right);
}
Node* delete(Node *root, T value) { // корень поддерева, удаляемый ключ
if (root == NULL)
return root;
if (value < root->data)
root->left = delete(root->left, value);
else if (value > root->data)
root->right = delete(root->right, value);
else if (root->left != NULL && root->right != NULL)
{
root->data = minimum(root->right)->data;
root->right = delete(root->right, root->data);
}
else
if (root->left != NULL)
root = root->left;
else
root = root->right;
return root;
}

void printTree(Node *root, const char *dir, int level) {
if (root) {
printf("lvl %d %s = %d\n", level, dir, root->data);
printTree(root->left, "left", level + 1);
printTree(root->right, "right", level + 1);
}
}
void main() {
Node *root = NULL;
char str[10];
int c;
FILE *f;
f = fopen("sort.txt", "r");
FILE *f2;
f2 = fopen("sort2.txt", "w");
for (int i = 0; i <= 9; i++)
{
fscanf(f, "%s", str);
fscanf(f,"%d", &c);
if (strcmp(str, "insert") == 0)
{
insert(&root, c);
}
else if (strcmp(str, "delete") == 0)
{
delete(root, c);
}
else if (strcmp(str, "exists") == 0)
{
fprintf(f2, "%s ", getNodeByValue(root, c));
}
else printf("ERROR");
printTree;

}
fclose(f);
fclose(f2);
printTree(root, "root", 0);
system("pause");
return 0;
}

По дате
По Рейтингу
Аватар пользователя
Новичок
6лет

Потому что в main указатель root на корневой узел есть, и куда ему деться-то? От начала и до конца программы на один адрес указывает, а ведь этот корень мог давно стать листом из-за удаления других узлов или мог сам быть удален из дерева. Поэтому в цикле надо не delete написать, а root = delete(root, c).
Кстати, не только корень не удаляется, но и все узлы - malloc есть, а ни одного free нету.