0

我在尝试旋转 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是一个函数,它返回作为输入给出的树的权重。

4

0 回答 0