5 практика
.pdf{
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