Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

إدراج

الدرس 9 من 16 في دورة شجرة AVL - سلسلة هياكل البيانات #10 على Coddy.

تبدأ عملية insert كعملية إدراج عادية في شجرة البحث الثنائية: النزول مع مقارنة القيم، والذهاب يساراً أو يميناً، ووضع العقدة الجديدة حيث يتم العثور على مكان فارغ (تجاهل التكرارات). يحدث جزء AVL أثناء العودة للأعلى: بعد وضع العقدة، يعيد كل سلف على المسار حساب height الخاص به ويتحقق من معامل التوازن الخاص به.

إذا أصبحت عقدة ما غير متوازنة، فإن الجانب الثقيل ومكان استقرار القيمة الجديدة يحددان معاً أي من الحالات الأربع تنطبق: تحتاج حالتا left-left و right-right إلى تدوير واحد، بينما تحتاج حالتا left-right و right-left إلى تدويرين، تدوير داخلي لتعديل التعرج (zig-zag) يليه تدوير خارجي.

challenge icon

التحدي

متوسط

اكتب طريقة insert(value) في AVLTree (استخدام دالة مساعدة تعاودية هو الطريقة الأكثر ترتيباً). قم بإدراج value مثل شجرة البحث الثنائية (BST) العادية، مع تجاهلها إذا كانت موجودة بالفعل. أثناء العودة للأعلى، أعد حساب ارتفاع كل عقدة وعامل التوازن (balance factor)، وإذا كانت العقدة غير متوازنة، فقم بتطبيق التدوير المناسب (أو زوج من التدويرات) قبل العودة إلى أعلى مكدس الاستدعاءات.

جرّب بنفسك

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

static void preorderValues(Node* node, int* vals, int* count) {
    if (node == NULL) {
        return;
    }
    vals[(*count)++] = node->value;
    preorderValues(node->left, vals, count);
    preorderValues(node->right, vals, count);
}

int main(void) {
    AVLTree* tree = AVLTree_create();
    char line[256];
    while (fgets(line, sizeof(line), stdin) != NULL) {
        line[strcspn(line, "\r\n")] = '\0';
        char cmd[32];
        int arg;
        int parsed = sscanf(line, "%31s %d", cmd, &arg);
        if (parsed >= 1 && strcmp(cmd, "insert") == 0) {
            AVLTree_insert(tree, arg);
        }
        if (parsed >= 1 && strcmp(cmd, "preorder") == 0) {
            int vals[10000];
            int count = 0;
            preorderValues(tree->root, vals, &count);
            for (int i = 0; i < count; i++) {
                if (i > 0) {
                    printf(" ");
                }
                printf("%d", vals[i]);
            }
            printf("\n");
        }
        if (parsed >= 1 && strcmp(cmd, "height") == 0) {
            printf("%d\n", AVLTree_getHeight(tree, tree->root));
        }
    }
    return 0;
}

جميع دروس شجرة AVL - سلسلة هياكل البيانات #10