تخطَّ إلى المحتوى

شرح Java

أشجار AVL المتوازنة

الدرس 39 من 42· ⏱ 2 دقائق قراءة

مشكلة BST العادية

عند إدراج أرقام مرتبة تصاعديًا في BST عادية، تصبح الشجرة مائلة لجهة واحدة وت失O(log n) لتصبح O(n).

ما هي شجرة AVL؟

شجرة BST تحافظ على فرق ارتفاع لا يزيد عن 1 بين أي فرعين — تُعيد توازنها تلقائيًا عبر دوران (rotations).

معامل التوازن

int height(TreeNode node) {
    return node == null ? 0 : node.height;
}

int getBalance(TreeNode node) {
    return node == null ? 0 : height(node.left) - height(node.right);
}

حالات الدوران الأربع

1. يسار يسار (LL) — دوران يميني

TreeNode rotateRight(TreeNode y) {
    TreeNode x = y.left;
    TreeNode T2 = x.right;
    x.right = y;
    y.left = T2;
    y.height = Math.max(height(y.left), height(y.right)) + 1;
    x.height = Math.max(height(x.left), height(x.right)) + 1;
    return x;
}

2. يمين يمين (RR) — دوران يساري

TreeNode rotateLeft(TreeNode x) {
    TreeNode y = x.right;
    TreeNode T2 = y.left;
    y.left = x;
    x.right = T2;
    x.height = Math.max(height(x.left), height(x.right)) + 1;
    y.height = Math.max(height(y.left), height(y.right)) + 1;
    return y;
}

3. يسار يمين (LR) — دوران يسار ثم يمين

4. يمين يسار (RL) — دوران يمين ثم يسار

الإدراج مع التوازن

TreeNode insert(TreeNode node, int value) {
    if (node == null) return new TreeNode(value);

    if (value < node.value)
        node.left = insert(node.left, value);
    else if (value > node.value)
        node.right = insert(node.right, value);
    else
        return node; // قيمة مكررة

    node.height = 1 + Math.max(height(node.left), height(node.right));

    int balance = getBalance(node);

    // LL
    if (balance > 1 && value < node.left.value)
        return rotateRight(node);

    // RR
    if (balance < -1 && value > node.right.value)
        return rotateLeft(node);

    // LR
    if (balance > 1 && value > node.left.value) {
        node.left = rotateLeft(node.left);
        return rotateRight(node);
    }

    // RL
    if (balance < -1 && value < node.right.value) {
        node.right = rotateRight(node.right);
        return rotateLeft(node);
    }

    return node;
}

مثال عملي

BST avl = new BST();
// إدراج أرقام مرتبة (ستسبب ميل في BST عادية)
for (int i = 1; i <= 7; i++) {
    avl.root = avl.insert(avl.root, i);
}
// الشجرة تبقى متوازنة — الارتفاع O(log n) دائمًا

التعقيد الزمني

العمليةAVL TreeBST عادية
بحثO(log n) مضمونO(n) في الأسوأ
إدراجO(log n) مضمونO(n) في الأسوأ
حذفO(log n) مضمونO(n) في الأسوأ

💡 AVL أقوى من BST في الضمان لكنها أبطأ قليلًا بسبب الدورانات الإضافية — مناسبة للبيانات التي تكثر فيها عمليات البحث.

🎯 التالي: التجزئة (Hashing).

شرح أشجار AVL المتوازنة — Java بالعربي
أشجار AVL المتوازنةJava بالعربي · The Code Fix

📚 لمزيد من التعمّق في Java، راجِع توثيق Java من Oracle.

هل كان هذا الدرس مفيدًا؟