Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

5 практика

.pdf
Скачиваний:
0
Добавлен:
01.12.2023
Размер:
485.22 Кб
Скачать

{

if(t->tmp->value > value)

{

t->tmp = t->tmp->left;

}

else

{

t->tmp = t->tmp->right;

}

if(t->tmp == NULL)

{

return NULL;

}

}

return t->tmp;

}

//Вставка значения в дерево:

//0 - вставка выполнена успешно

//1 - элемент существует

//2 - не удалось выделить память для нового элемента

11

int insert(tree* t, int value)

{

node *root2 = t->root, *root3 = NULL; t->tmp = malloc(sizeof(node)); t->tmp->value = value;

if (t->root == NULL)

{

t->tmp->parent = NULL; t->tmp->left = NULL; t->tmp->right = NULL; t->root = t->tmp; t->numbers = 1;

return 0;

}

while (root2 != NULL)

{

root3 = root2;

if (value == root2->value)

{

return 1;

}

if (value < root2->value)

12

{

root2 = root2->left;

}

else

{

root2 = root2->right;

}

}

t->tmp->parent = root3; t->tmp->left = NULL; t->tmp->right = NULL; if (value < root3->value)

{

root3->left = t->tmp; t->numbers = t->numbers + 1; return 0;

}

if (value > root3->value)

{

root3->right = t->tmp; t->numbers = t->numbers +1; return 0;

13

}

}

//Удалить минимальный элемент из поддерева, корнем которого является n

//Вернуть значение удаленного элемента

int remove_min(node* n)

{

int b;

node *tmp = n;

while (tmp->left != NULL)

{

tmp = tmp->left;

}

b = tmp->value; if(tmp->right != NULL)

{

if(b < tmp->parent->value)

{

tmp->parent->left = tmp->right; free(tmp);

return b;

14

}

else

{

tmp->parent->right = tmp->right; free(tmp);

return b;

}

}

else

{

if (b < tmp->parent->value)

{

tmp->parent->left = NULL; free(tmp);

return b;

}

else

{

tmp->parent->right = NULL; free(tmp);

return b;

}

15

}

}

//Удалить элемент из дерева:

//0 - удаление прошло успешно

//1 - нет элемента с указанным значением

int remove_node(tree* t, int value)

{

int b;

node *tmp = find(t, value); if (tmp == NULL)

return 1;

if (tmp->left==NULL && tmp->right==NULL)

{

if(tmp != t->root)

{

if (tmp->value < tmp->parent->value)

{

tmp->parent->left = NULL; free(tmp);

t->numbers = t->numbers-1;

16

return 0;

}

else

{

tmp->parent->right = NULL; free(tmp);

t->numbers = t->numbers-1; return 0; //конец

}

}

else

{

free(tmp); t->root = NULL; t->numbers = 0; return 0;

}

}

if (tmp->left==NULL && tmp->right!=NULL)

{

if(tmp != t->root)

{

17

if (tmp->value < tmp->parent->value)

{

tmp->parent->left = tmp->right; tmp->right->parent = tmp->parent; free(tmp);

t->numbers = t->numbers-1; return 0;

}

else

{

tmp->parent->right = tmp->right; tmp->right->parent = tmp->parent; free(tmp);

t->numbers = t->numbers-1; return 0;

}

}

else

{

tmp->right->parent = NULL; t->root = tmp->right; free(tmp);

18

t->numbers = t->numbers-1; return 0;

}

}

if (tmp->left!=NULL && tmp->right==NULL)

{

if(tmp !=t->root)

{

if (tmp->value < tmp->parent->value)

{

tmp->parent->left = tmp->left; tmp->left->parent = tmp->parent; free(tmp);

t->numbers = t->numbers-1; return 0;

}

else

{

tmp->parent->right = tmp->left; tmp->left->parent = tmp->parent; free(tmp);

t->numbers = t->numbers-1;

19

return 0;

}

}

else

{

tmp->left->parent = NULL; t->root = tmp->left; free(tmp);

t->numbers = t->numbers-1; return 0;

}

}

if(tmp->right!=NULL && tmp->left!=NULL)

{

b = remove_min(tmp->right); tmp->value = b;

t->numbers = t->numbers-1; return 0;

}

}

// Выполнить правое вращение поддерева, корнем которого является n:

20

Соседние файлы в предмете Структуры данных