Я столкнулся с проблемой при попытке повернуть дерево 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это функция, которая возвращает вес дерева, заданного в качестве входных данных.

0 ответов

Другие вопросы по тегам