avl tree - ll旋转problam

时间:2018-05-07 19:40:58

标签: c++ avl-tree

我一直试图调试我的代码超过一个小时,我无法理解问题所在。 我有这个类作为顶点:

class avl_node {
public:
    T data;
    int value;
    int high;
    avl_node *left, *right;
    avl_node *parent;

我有这棵树(在尝试将21插入树之前和之后): I am losing info

这是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;
}

2 个答案:

答案 0 :(得分:0)

您是否在纸上追踪了ll_rotate行动?无论函数开头的v->left点是否丢失,因为您永远不会将tmp重新分配给v原始父级的正确子节点。

答案 1 :(得分:0)

您没有更新left之父的rightv指针。可能还有其他一些问题。这是我工作实现的一些代码。变量名称不同,但您可以将它与您的名称进行比较,看看您缺少哪些操作。最后调用的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);
}