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

171

Модуль 3. Лекція 13. Бінарні дерева

1. Бінарне дерево

2. Бінарні дерева пошуку

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

4. Арифметичні операції з елементами дерева

1. Бінарне дерево

Окремим випадком дерева є бінарне (двійкове) дерево.

Визначення 2.

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

Найпоширенішими операціями для роботи з деревами є: створення дерева, додавання вузла в дерево, видалення вузла з дерева, обхід дерева та пошук у ньому. Обхід бінарного дерева можливий в глибину і в ширину, як і для загальних дерев.

Через те, що кожен вузол має не більше двох нащадків, його реалізація спрощується.

Рис.1. Бінарне дерево

Приклад 1. Реалізація бінарного дерева

Ця реалізація бінарного дерева трохи відрізняється від звичайного дерева і значно спрощується. Ми маємо рекурсивне визначення класу BinaryTree <T>, яке містить значення, лівий і правий дочірні вузли, які належать до одного типу BinaryTree <T>. Ми маємо точно два вузли нащадки (лівий і правий) замість списку.

Метод PrintInOrder () працює рекурсивно за допомогою алгоритму DFS (обхід в глибину). Він проходить кожен вузол у "прямому порядку" (спочатку лівий нащадок, потім сам вузол, потім правий нащадок).

Алгоритм обходу DFS виконує наступні дії:

1. Рекурсивний виклик для переходу до лівого під-дерева даного вузла.

2. Відвідування самого вузла (виведення його значення на консоль).

3. Рекурсивний виклик для переходу до правого під-дерева.

namespace Lab12_BinaryTree

{

/// <summary>Клас, який реалізує бінарне дерево</summary>

/// <typeparam name="T">тип значень вузлів дерева </typeparam>

public class BinaryTree<T>

{

public T Value { get; set; }

public BinaryTree<T> LeftChild { get; private set; }

public BinaryTree<T> RightChild { get; private set; }

//конструктор, який створює вузол з нащадками

public BinaryTree(T value, BinaryTree<T> leftChild, BinaryTree<T> rightChild)

{

Value = value;

LeftChild = leftChild;

RightChild = rightChild;

}

//конструктор, який створює бінарне дерево без нащадків (листок)

public BinaryTree(T value) : this(value, null, null) { }

//Обхід дерева вглиб

public void PrintInOrder()

{ // 1. вивести лівий вузол-нащадок

if (this.LeftChild != null)

{

LeftChild.PrintInOrder();

}

// 2. вивести корінь цього піддерева (вузол)

Console.Write(this.Value + " ");

// 3. вивести правий вузол-нащадок

if (this.RightChild != null)

{

RightChild.PrintInOrder();

}

}

}

}

В методі main() виконується створення бінарного дерева і його прямий обхід в глибину.

namespace Lab12_BinaryTree

{

public class Program

{

static void Main()

{

// Створення бінарного дерева

BinaryTree<int> binaryTree =

new BinaryTree<int>(14,

new BinaryTree<int>(19,

new BinaryTree<int>(23),

new BinaryTree<int>(6,

new BinaryTree<int>(10),

new BinaryTree<int>(21))),

new BinaryTree<int>(15,

new BinaryTree<int>(3), null));

// Обхід бінарного дерева і виведення його вузлів

binaryTree.PrintInOrder();

Console.ReadKey();

}

}

}

Console output: 23 19 10 6 21 14 3 15