我一直试图调试我的代码超过一个小时,我无法理解问题所在。 我有这个类作为顶点:
class avl_node {
public:
T data;
int value;
int high;
avl_node *left, *right;
avl_node *parent;
我有这棵树(在尝试将21插入树之前和之后):
这是ll旋转功能:
Status ll_rotation(avl_node<T> *v) {
avl_node<T>* tmp = v->left;
v->left = tmp->right;
if (tmp->right){
tmp->right->parent = v;
}
tmp->right = v;
tmp->parent = v->parent;
v->parent = tmp;
if (this->root == v) {
this->root = tmp;
}
return OK;
}
答案 0 :(得分:0)
您是否在纸上追踪了ll_rotate
行动?无论函数开头的v->left
点是否丢失,因为您永远不会将tmp
重新分配给v
原始父级的正确子节点。
答案 1 :(得分:0)
您没有更新left
之父的right
或v
指针。可能还有其他一些问题。这是我工作实现的一些代码。变量名称不同,但您可以将它与您的名称进行比较,看看您缺少哪些操作。最后调用的update_height
函数遍历树,更新每个节点的高度。
template<typename K, typename V>
void AVLTree<K,V>::right_rotate(AVLNode<K,V> *node)
{
auto hold = node->left;
if (node == root)
{
root = hold;
}
else if (node == node->parent->left)
{
node->parent->left = hold;
}
else
{
node->parent->right = hold;
}
hold->parent = node->parent;
node->left = node->left->right;
if (node->left)
{
node->left->parent = node;
}
hold->right = node;
node->parent = hold;
update_height(node);
}