Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
33
Добавлен:
15.01.2021
Размер:
95.81 Кб
Скачать

3. Алгоритми роботи з деревами пошуку

Основні операції роботи з бінарними деревами пошуку.

Insert – вставка вузла в дерево;

Find - пошук вузла за вказаним значенням;

Contains – перевірка, чи є таке значення у дереві;

Remove – видалення вузла.

А також реалізуємо рекурсивний метод обходу дерева.

  1. Вставка (додавання вузла)

Вставка (або додавання) елемента в двійковому дереві пошуку означає розміщення вузла у дереві із збереженням порядку.

Алгоритм.

  1. Якщо дерево порожнє, ми додаємо новий елемент як корінь.

  2. В іншому випадку:

- Якщо елемент менше кореня, ми викликаємо рекурсивно той самий метод, щоб додати елемент у ліве під-дерево.

- Якщо елемент більше кореня, ми викликаємо рекурсивно той самий метод, щоб додати елемент до правого під-дерева.

- Якщо елемент дорівнює кореню, ми нічого не робимо і виходимо з рекурсії.

Таким чином, ми бачимо, як алгоритм вставки вузла відповідає правилу «елементи в лівому під-дереві менше, ніж корінь, а елементи у правому під-дереві більше кореня».

Методи вставки вузла у дерево. Перший метод вставляє корінь. Другий метод вставляє вузол в залежності від значення вузла.

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;

}

  1. Крім того, ми визначаємо булевий метод Contains() , який перевіряє, чи належить певне значення до дерева.

// перевіряє, чи є у дереві вузол з вказаним значенням

public bool Contains(T value)

{

bool found = Find(value) != null; return found;

}