Я столкнулся с проблемой при попытке повернуть дерево AVL в C
У меня возникли проблемы при попытке повернуть дерево AVL. Я копался в сети целый день и думаю, что мой код должен работать. Я не знаю почему, но когда я проверяю свою функцию, я теряю поддеревья, которые должны были быть повернуты.
Могу ли я получить какую-либо помощь?
Вот код:
static void cbst__rotation_right(cbst **pp) {
cbst *p = LEFT(*pp);
LEFT(*pp) = RIGHT(p);
RIGHT(p) = *pp;
*pp=p;
cbst__update_height(*pp);
}
static void cbst__rotation_left(cbst **pp) {
cbst *p = RIGHT(*pp);
RIGHT(*pp) = LEFT(p);
LEFT(p) = *pp;
*pp= p;
cbst__update_height(*pp);
}
static void cbst__rotation_left_right(cbst **pp) {
cbst__rotation_left(&LEFT(*pp));
cbst__rotation_right(pp);
}
static void cbst__rotation_right_left(cbst **pp) {
cbst__rotation_right(&RIGHT(*pp));
cbst__rotation_left(pp);
}
А вот функция, которая уравновешивает дерево:
static void cbst__balancing(cbst **pp) {
if ((*pp) == NULL) {
return;
}
cbst__update_height(*pp);
if (cbst_balance(*pp) <= 1 && cbst_balance(*pp) >= (-1)) {
return;
}
if (cbst__balance(*pp) == 2) {
if (cbst__balance(LEFT(*pp)) == (-1)) {
cbst__rotation_left_right(pp);
}
if (cbst__balance(LEFT(*pp)) == 1) {
cbst__rotation_right(pp);
}
if (cbst_balance(LEFT(*pp)) != 1 && cbst_balance(LEFT(*pp)) != (-1)) {
cbst__balancing(&LEFT(*pp));
}
}
if (cbst__balance(*pp) == (-2)) {
if (cbst__balance(RIGHT(*pp)) == +1) {
cbst__rotation_right_left(pp);
}
if (cbst__balance(RIGHT(*pp)) == (-1)) {
cbst__rotation_left(pp);
}
if (cbst_balance(RIGHT(*pp)) != 1 && cbst_balance(RIGHT(*pp)) != (-1)) {
cbst__balancing(&RIGHT(*pp));
}
}
cbst__balancing(pp);
}
Примечание:
cbst__balance
это функция, которая возвращает вес дерева, заданного в качестве входных данных.