С++ AVL сортировка дерева

Пытаюсь сортировать методом AVL, ключа 3, берется один выбранный из них... Не получается выполнить сортировку, вероятнее всего нижний цикл что я написал нерабочий. Очень надеюсь на помощь :(

struct library {
    unsigned int UDK : 10; // 929 max
    char author[40];
    char name[40];
    unsigned int year : 11; // 2018 max  - MAKE SYS TIME
    unsigned int copies : 27; // 100 000 000 max 
    library *left = NULL;
    library *right = NULL;
};
// считываю из файла динамическое количество листов
library *books = new library[number]
// далее привожу все к дереву, бинарному, но не сбалансированному. Использую ключ по выбору из трех, так что функция вышла длинноватой.
void AddNode(library *data, library *node, int priority) {
    switch (priority)
    {
    case 1:
        if (node->UDK < data->UDK) {
            if (data->left != NULL) AddNode(data->left, node, priority);
            else data->left = node;
        }
        else if (node->UDK > data->UDK) {
            if (data->right != NULL) AddNode(data->right, node, priority);
            else data->right = node;
        }
        else print("Simple elements - can't add.");
        break;
    case 2:
        if (node->year < data->year) {
            if (data->left != NULL) AddNode(data->left, node, priority);
            else data->left = node;
        }
        else if (node->year > data->year) {
            if (data->right != NULL) AddNode(data->right, node, priority);
            else data->right = node;
        }
        else print("Simple elements - can't add.");
        break;
    case 3:
        if (node->copies < data->copies) {
            if (data->left != NULL) AddNode(data->left, node, priority);
            else data->left = node;
        }
        else if (node->copies > data->copies) {
            if (data->right != NULL) AddNode(data->right, node, priority);
            else data->right = node;
        }
        else print("Simple elements - can't add.");
        break;
    default:
        break;
    }
}


// получаем высоту ветви
int Height(library *books) {
    int left, right;
    if (books == NULL) return 0;
    left = Height(books->left);
    right = Height(books->right);
    if (left > right) return left + 1;
    else return right + 1;
}
//Имеются данные функции поворота ветви
void rotateLeftOnce(library *node) {
    library *otherNode;
    otherNode = node->left;
    node->left = otherNode->right;
    otherNode->right = node;
    node = otherNode;
}

void rotateRightOnce(library *node) {
    library *otherNode;
    otherNode = node->right;
    node->right = otherNode->left;
    otherNode->left = node;
    node = otherNode;
}

//Таким способом пытаюсь их вращать:
if ((number - 1) % 2 == 1) {
    if ((books + root)->left != NULL && (books + root)->right != NULL) {
        if (Height((books + root)->left) - Height((books + root)->right) >= 2 || Height((books + root)->right) - Height((books + root)->left) >= 2) {
            while (Height((books + root)->left) - Height((books + root)->right) >= 2) rotateLeftOnce(books + root);
            while (Height((books + root)->right) - Height((books + root)->left) >= 2) rotateRightOnce(books + root);;
        }
    }
}
else {
    if ((books + root)->left != NULL && (books + root)->right != NULL) {
        if (Height((books + root)->left) - Height((books + root)->right) > 0 || Height((books + root)->right) - Height((books + root)->left) > 0) {
            while (abs(Height((books + root)->left) - Height((books + root)->right)) > 0) if ((books + root)->left != NULL) rotateLeftOnce(books + root);
            cout << "hello" << endl;
            while (abs(Height((books + root)->right) - Height((books + root)->left)) > 0)  if ((books + root)->left != NULL) rotateRightOnce(books + root);
        }
    }
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.