Menu
Coddy logo textTech

Rotation droite

Leçon 7 sur 16 du cours Arbre AVL - Série Structures de données n°10 de Coddy.

Lorsqu'un côté gauche d'un nœud est trop haut, une rotation à droite le corrige. Appelez le nœud déséquilibré y et son enfant gauche x. La rotation promeut x pour prendre la place de y : x devient la nouvelle racine du sous-arbre, y devient l'enfant droit de x, et l'ancien sous-arbre droit de x (appelons-le T2) est rattaché comme le nouvel enfant gauche de y, puisque chaque valeur dans T2 est toujours supérieure à x et inférieure à y.

Après avoir relié les pointeurs, y et x doivent tous deux voir leur height recalculée, y en premier puisqu'il est désormais plus bas dans l'arbre.

challenge icon

Défi

Facile

Écrivez une méthode rotateRight(y) sur AVLTree. Soit x = y.left et T2 = x.right. Définissez x.right = y et y.left = T2, recalculez la height de y puis de x comme 1 + max(getHeight(left), getHeight(right)), et retournez x comme la nouvelle racine du sous-arbre.

Essayez vous-même

#include <stdio.h>
#include <string.h>
#include "avltree.h"

int main(void) {
    AVLTree* tree = AVLTree_create();
    char line[256];
    while (fgets(line, sizeof(line), stdin) != NULL) {
        line[strcspn(line, "\r\n")] = '\0';
        if (strcmp(line, "1") == 0) {
            Node* y = Node_create(30);
            y->height = 3;
            Node* x = Node_create(20);
            x->height = 2;
            Node* t1 = Node_create(10);
            t1->height = 1;
            x->left = t1;
            y->left = x;
            Node* newRoot = AVLTree_rotateRight(tree, y);
            printf("%d %d %d %d\n", newRoot->value, newRoot->height, newRoot->left->value, newRoot->right->value);
        }
        if (strcmp(line, "2") == 0) {
            Node* y = Node_create(50);
            y->height = 3;
            Node* x = Node_create(30);
            x->height = 2;
            x->left = Node_create(20);
            x->left->height = 1;
            x->right = Node_create(40);
            x->right->height = 1;
            y->left = x;
            y->right = Node_create(60);
            y->right->height = 1;
            Node* newRoot = AVLTree_rotateRight(tree, y);
            printf("%d %d %d %d %d %d\n", newRoot->value, newRoot->height, newRoot->left->value, newRoot->right->value, newRoot->right->left->value, newRoot->right->right->value);
        }
    }
    return 0;
}

Toutes les leçons de Arbre AVL - Série Structures de données n°10