TGViewer
Библиотека шарписта | C#, F#, .NET, ASP.NET Библиотека шарписта | C#, F#, .NET, ASP.NET @csharpproglib · 21.6K subscribers
Post #5946 3.69K
🎮 Поиск в сбалансированном дереве — AVL Tree

Проблема:
при работе с большими наборами данных обычное бинарное дерево поиска (BST) может деградировать в линейную структуру, что снижает скорость поиска до O(n).

Решение: В книге Algorithms and Data Structures for OOP With C# автор предлагает использовать AVL-дерево — сбалансированное дерево, которое поддерживает балансировку после каждой операции вставки или удаления. Это гарантирует сложность поиска, вставки и удаления за O(log n).

Пример кода:
public class AVLNode
{
public int Key;
public AVLNode Left, Right;
public int Height;

public AVLNode(int key)
{
Key = key;
Height = 1;
}
}

public class AVLTree
{
private AVLNode root;

int Height(AVLNode node) => node?.Height ?? 0;

int BalanceFactor(AVLNode node) => Height(node.Left) - Height(node.Right);

AVLNode RightRotate(AVLNode y)
{
var x = y.Left;
var 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;
}

AVLNode LeftRotate(AVLNode x)
{
var y = x.Right;
var 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;
}

public AVLNode Insert(AVLNode node, int key)
{
if (node == null)
return new AVLNode(key);

if (key < node.Key)
node.Left = Insert(node.Left, key);
else if (key > node.Key)
node.Right = Insert(node.Right, key);
else
return node;

node.Height = 1 + Math.Max(Height(node.Left), Height(node.Right));

int balance = BalanceFactor(node);

if (balance > 1 && key < node.Left.Key)
return RightRotate(node);

if (balance < -1 && key > node.Right.Key)
return LeftRotate(node);

if (balance > 1 && key > node.Left.Key)
{
node.Left = LeftRotate(node.Left);
return RightRotate(node);
}

if (balance < -1 && key < node.Right.Key)
{
node.Right = RightRotate(node.Right);
return LeftRotate(node);
}

return node;
}
}


Преимущества:
— Обеспечение сбалансированного дерева с высотой O(log n)
— Быстрый поиск и обновление данных
— Подходит для систем, требующих высокопроизводительных операций поиска

➡️ Лучшее из мира IT-книг — у нас в @progbook
  • 👍 7
  • ❤ 2
  • 🔥 1
More from @csharpproglib
  1. Oct 7, 2026Альфа-Банк ищет скиллового коллегу QA Fullstack на C# Полная удалёнка или гибрид в Москве,…
  2. Oct 5, 2026🦈 Открытое собеседование на Middle C# | 6 октября, 19:00 МСК Приглашаем на открытое собес…
  3. Sep 30, 2026📝 Логирование со строковой интерполяцией Логирование c интерполяцией строк один из самых…
  4. Sep 28, 2026👨‍💻 Не показывайте технические ошибки пользователям Когда приложение падает с необработа…
  5. Sep 26, 2026📍 Навигация: Вакансии • Задачи • Собесы 🐸 Библиотека шарписта #garbage_collector
  6. Sep 25, 2026🔐 NuGet: Microsoft меняет сертификат подписи С 23 сентября Microsoft использует новый сер…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →