
3. Алгоритми роботи з деревами пошуку
Основні операції роботи з бінарними деревами пошуку.
Insert – вставка вузла в дерево;
Find - пошук вузла за вказаним значенням;
Contains – перевірка, чи є таке значення у дереві;
Remove – видалення вузла.
А також реалізуємо рекурсивний метод обходу дерева.
Вставка (додавання вузла)
Вставка (або додавання) елемента в двійковому дереві пошуку означає розміщення вузла у дереві із збереженням порядку.
Алгоритм.
Якщо дерево порожнє, ми додаємо новий елемент як корінь.
В іншому випадку:
- Якщо елемент менше кореня, ми викликаємо рекурсивно той самий метод, щоб додати елемент у ліве під-дерево.
- Якщо елемент більше кореня, ми викликаємо рекурсивно той самий метод, щоб додати елемент до правого під-дерева.
- Якщо елемент дорівнює кореню, ми нічого не робимо і виходимо з рекурсії.
Таким чином, ми бачимо, як алгоритм вставки вузла відповідає правилу «елементи в лівому під-дереві менше, ніж корінь, а елементи у правому під-дереві більше кореня».
Методи вставки вузла у дерево. Перший метод вставляє корінь. Другий метод вставляє вузол в залежності від значення вузла.
public void Insert(T value)
{
root = Insert(value, null, root);
}
// вставка вузла в бінарне дерево пошуку в залежності від значення у вузлі
private BinaryTreeNode<T> Insert(T value, BinaryTreeNode<T> parentNode, BinaryTreeNode<T> node)
{
if (node == null)
{
node = new BinaryTreeNode<T>(value);
node.parent = parentNode;
}
else
{
int compareTo = value.CompareTo(node.value);
if (compareTo < 0)
{
node.leftChild = Insert(value, node, node.leftChild);
}
else if (compareTo > 0)
{
node.rightChild = Insert(value, node, node.rightChild);
}
}
return node;
}
}
2. Пошук потрібного елемента у вузлі
Алгоритм пошуку
1. Починаємо з вузла елемента, що вказує на корінь.
2. Після цього ми робимо наступне:
- Якщо елемент дорівнює вузлу, ми знайшли шуканий елемент і повернули його.
- Якщо елемент менший за вузол, ми призначаємо вузол лівому нащадку, тобто продовжуємо пошук у лівому під-дереві.
- Якщо елемент більше, ніж вузол, ми призначаємо вузол його правому нащадку, тобто продовжуємо пошук у правому під-дереві.
Наприкінці алгоритм повертає знайдений вузол або null, якщо такого вузла у дереві немає.
// Пошук - знаходить задане значення в дереві та
/// повертає вузол, що містить це значення, якщо таке існує
private BinaryTreeNode<T> Find(T value)
{
BinaryTreeNode<T> node = this.root;
while (node != null)
{
int compareTo = value.CompareTo(node.value);
if (compareTo < 0)
{ node = node.leftChild; }
else if (compareTo > 0) { node = node.rightChild; } else { break; }
}
return node;
}
Крім того, ми визначаємо булевий метод Contains() , який перевіряє, чи належить певне значення до дерева.
// перевіряє, чи є у дереві вузол з вказаним значенням
public bool Contains(T value)
{
bool found = Find(value) != null; return found;
}