مشكلة 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 Tree | BST عادية |
|---|---|---|
| بحث | O(log n) مضمون | O(n) في الأسوأ |
| إدراج | O(log n) مضمون | O(n) في الأسوأ |
| حذف | O(log n) مضمون | O(n) في الأسوأ |
💡 AVL أقوى من BST في الضمان لكنها أبطأ قليلًا بسبب الدورانات الإضافية — مناسبة للبيانات التي تكثر فيها عمليات البحث.
🎯 التالي: التجزئة (Hashing).