балансировка дерева AVL (C ++)

Мне очень сложно понять, как сбалансировать дерево AVL для моего класса. Я вставил это с помощью этого:

Node* Tree::insert(int d)
{
    cout << "base insert\t" << d << endl;
    if (head == NULL)
        return (head = new Node(d));
    else
        return insert(head, d);
}

Node* Tree::insert(Node*& current, int d)
{
    cout << "insert\t" << d << endl;
    if (current == NULL)
        current = new Node(d);
    else if (d < current->data) {
        insert(current->lchild, d);
        if (height(current->lchild) - height(current->rchild)) {
            if (d < current->lchild->getData())
                rotateLeftOnce(current);
            else
                rotateLeftTwice(current);
        }
    }
    else if (d > current->getData()) {
        insert(current->rchild, d);
        if (height(current->rchild) - height(current->lchild)) {
            if (d > current->rchild->getData())
                rotateRightOnce(current);
            else
                rotateRightTwice(current);
        }
    }

    return current;
}

Мой план состоял в том, чтобы вызовы функции balance () проверяли, нуждается ли дерево в балансировке, а затем балансировать по мере необходимости. Проблема в том, что я даже не могу понять, как пройти по дереву, чтобы найти правильный несбалансированный узел. Я знаю, как рекурсивно обходить дерево, но я не могу перевести этот алгоритм на поиск самого нижнего несбалансированного узла. У меня также возникли проблемы с написанием итеративного алгоритма. Любая помощь будет оценена. :)

20
задан gregghz 20 November 2010 в 08:33
поделиться