typedef struct node
{
int value;
int heigh;
struct node* left;
struct node* right;
}Tree;
Tree* add(Tree* t, int v, int* f)
{
if (t == NULL)
{
t = (Tree*)malloc(sizeof(Tree));
t->value = v;
t->heigh = 0;
t->left = NULL;
t->right = NULL;
f[1] = 1;
return t;
}
if (v < t->value)
t->left = add(t->left, v, f);
else
{
if (v > t->value)
t->right = add(t->right, v, f);
}
return t;
}
int heigh(Tree* t)
{
if (t == NULL)
return 0;
else
{
int hl = heigh(t->left);
int hr = heigh(t->right);
if (hl >= hr)
return 1 + hl;
else
return 1 + hr;
}
}
Tree* left(Tree* t)
{
Tree* newt = t->right;
t->right = newt->left;
newt->left = t;
return newt;
}
Tree* right(Tree* t)
{
Tree* newt = t->left;
t->left = newt->right;
newt->right = t;
return newt;
}
Tree* balance(Tree* t)
{
if (t != NULL)
{
t->left = balance(t->left);
t->right = balance(t->right);
if (heigh(t->right) - heigh(t->left) < -1) //-2
{
if (heigh(t->left->left) < heigh(t->left->right))
t->left = left(t->left);
t = right(t);
}
else
{
if (heigh(t->right) - heigh(t->left) > 1) //2
{
if (heigh(t->right->right) < heigh(t->right->left))
t->right = right(t->right);
t = left(t);
}
}
}
return t;
}
Tree* minimum(Tree* t)
{
while (t->left != NULL)
t = t->left;
return t;
}
Tree* successor(Tree* t)
{
if (t->right != NULL)
return minimum(t->right);
return NULL;
}
Tree* removed(Tree* t, int x, int* f)
{
if (t == NULL)
return t;
else
{
if (x < t->value)
{
t->left = removed(t->left, x, f);
return t;
}
else
{
if (x > t->value)
{
t->right = removed(t->right, x, f);
return t;
}
else
{
if (t->value == x)
{
f[0] = 1;
if (t->left == NULL && t->right == NULL)
t = NULL;
else
{
if (t->left == NULL)
t = t->right;
else
{
if (t->right == NULL)
t = t->left;
else
{
Tree* tmp = successor(t);
t->value = tmp->value;
t->right = removed(t->right, tmp->value, f);
}
}
}
return t;
}
}
}
}
}
C/C++
Помогите оптимизировать код для АВЛ дерева, чтобы значение высоты сохранялось в узле дерева
Оптимизация кода для АВЛ дерева:
1. Добавление узла:
- В функции add() после добавления нового узла необходимо пересчитать высоту дерева. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.
- При добавлении нового узла необходимо проверять, нарушается ли баланс дерева. Если да, то необходимо вызвать функцию balance() для восстановления баланса.
2. Удаление узла:
- В функции removed() после удаления узла необходимо пересчитать высоту дерева. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.
- При удалении узла необходимо проверять, нарушается ли баланс дерева. Если да, то необходимо вызвать функцию balance() для восстановления баланса.
3. Балансировка дерева:
- В функции balance() необходимо пересчитывать значение высоты узла после балансировки. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.
- В функции balance() необходимо проверять, является ли дерево уже сбалансированным. Если да, то необходимо прекратить балансировку и вернуть текущий узел.
- В функции balance() необходимо использовать правильные методы поворотов для восстановления баланса. Например, для правого поворота используется функция right(), а для левого поворота - функция left().
1. Добавление узла:
- В функции add() после добавления нового узла необходимо пересчитать высоту дерева. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.
- При добавлении нового узла необходимо проверять, нарушается ли баланс дерева. Если да, то необходимо вызвать функцию balance() для восстановления баланса.
2. Удаление узла:
- В функции removed() после удаления узла необходимо пересчитать высоту дерева. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.
- При удалении узла необходимо проверять, нарушается ли баланс дерева. Если да, то необходимо вызвать функцию balance() для восстановления баланса.
3. Балансировка дерева:
- В функции balance() необходимо пересчитывать значение высоты узла после балансировки. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.
- В функции balance() необходимо проверять, является ли дерево уже сбалансированным. Если да, то необходимо прекратить балансировку и вернуть текущий узел.
- В функции balance() необходимо использовать правильные методы поворотов для восстановления баланса. Например, для правого поворота используется функция right(), а для левого поворота - функция left().
- Добавьте ссылку на вышележащий узел, это сильно упростит ряд моментов.
- malloc есть а free нету. Непорядок.
- По возможности избавляйтесь от рекурсии.
Похожие вопросы
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++, динамическое программирование)?
- Как оптимизировать код, чтобы не было превышения по времени к задаче (C++)?
- Как ещё можно оптимизировать код?
- Помогите с кодом C++
- Помогите с кодом с++
- Помогите с кодом С++
- Помогите с кодом с++
- Помогите дописать код с массивом
- Помогите дописать код с массивом?
- Помогите дописать код с массивом C++