我正在研究树木,一切似乎都很好,直到我开始了一个需要旋转的avl树。我建立了一个旋转算法,在2或3次旋转之前工作正常,算法如下:
static void _nodeRotateRight(avl_tree* t, avl_tree_node** n) {
avl_tree_node* node = (*n)->left;
// refresh parents before rotate
if (node->right)
node->right->parent = (*n);
if ((*n) == t->top) {
t->top = node;
node->parent = NULL;
}
else {
(*n)->parent->right = node;
node->parent = (*n)->parent;
}
(*n)->parent = (*n)->left;
// rotate nodes (pointers)
(*n)->left = node->right;
node->right = (*n);
(*n) = node;
// refresh heights
(*n)->right->height -= 2;
}
错误已开启: (* n) - > parent-> right = node;
实际上有效,但在3º旋转时有一个奇怪的行为,为“右”分配一个新值实际上改变了( _n)而不是右边。 显然( _n) - > parent-> right指向( _n),但是如果我向右分配一个新值,我不能改变( _n)因为它们是不同的地址不同的指针... 解决这个问题的方法是什么?
答案 0 :(得分:1)
您应该缓存*n
的值。
avl_tree_node *n1 = *n;
现在,无论您如何更改*n
,n1
都将继续指向原始节点。