C/C++

Помогите оптимизировать код для АВЛ дерева, чтобы значение высоты сохранялось в узле дерева

 
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;
}
}
}
}
}
Оптимизация кода для АВЛ дерева:

1. Добавление узла:

- В функции add() после добавления нового узла необходимо пересчитать высоту дерева. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.

- При добавлении нового узла необходимо проверять, нарушается ли баланс дерева. Если да, то необходимо вызвать функцию balance() для восстановления баланса.

2. Удаление узла:

- В функции removed() после удаления узла необходимо пересчитать высоту дерева. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.

- При удалении узла необходимо проверять, нарушается ли баланс дерева. Если да, то необходимо вызвать функцию balance() для восстановления баланса.

3. Балансировка дерева:

- В функции balance() необходимо пересчитывать значение высоты узла после балансировки. Для этого можно использовать функцию heigh() и сохранять значение высоты в поле heigh структуры Tree.

- В функции balance() необходимо проверять, является ли дерево уже сбалансированным. Если да, то необходимо прекратить балансировку и вернуть текущий узел.

- В функции balance() необходимо использовать правильные методы поворотов для восстановления баланса. Например, для правого поворота используется функция right(), а для левого поворота - функция left().
АК
Артём Круглов
2 044
Лучший ответ
  1. Добавьте ссылку на вышележащий узел, это сильно упростит ряд моментов.
  2. malloc есть а free нету. Непорядок.
  3. По возможности избавляйтесь от рекурсии.