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