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

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

Поширеними алгоритмами роботи з бінарним деревом пошуку є знаходження суми елементів дерева, суми елементів у листах (кінцевих вузлах).

Проблема реалізації цих алгоритмів у C# полягає в тому, що клас BinarySearchTree<T> є універсальним, а в таких класах не визначені арифметичні операції.

Рішення проблеми:

  1. Створити одразу конкретні класи дерева і вузла.

  2. Створити похідний клас, який конкретизує універсальний.

Розглянемо другий варіант рішення. Створимо для прикладу 4 конкретний клас BinaryTreeInt похідний від BinarySearchTree<T>.

В цьому класі реалізуємо метод обчислення суми елементів вузлів.

namespace BinarySearchT

{//конкретний клас, який реалізує операції з бінарним деревом.

//конкретизує універсальний клас BinarySearchTree

public class BinaryTreeInt : BinarySearchTree<int>

{

public int GetSum()

{

//Обчислення суми значень елементів дерева

int sum = 0;

//Виклик рекурсивного методу обчислення суми

GetSumRecursion(root, ref sum);

return sum;

}

private static void GetSumRecursion(BinaryTreeNode<int> node, ref int sum)

{

//Рекурсивний метод обчислення суми елементів дерева

//Додаємо елемент з поточної вершини

sum += node.value;

//Рахуємо суму для левого піддерева

if (node.leftChild != null)

GetSumRecursion(node.leftChild, ref sum);

//Рахуємо суму для правого піддерева

if (node.rightChild != null)

GetSumRecursion(node.rightChild, ref sum);

}

}

}

Для того, щоб у класі BinaryTreeInt мати доступ до вузлів, потрібно зробити поля вузла відкритими.

public T value; // значення вузла

public BinaryTreeNode<T> parent; // предок вузла

public BinaryTreeNode<T> leftChild; //лівий нащадок вузла

public BinaryTreeNode<T> rightChild; //правий нащадок вузла

В програму вставимо виклик цих методів.

class Program

{

static void Main(string[] args)

{

//Бінарне дерево пошуку чисел

BinaryTreeInt tree = new BinaryTreeInt();

tree.Insert(8);

tree.Insert(4);

tree.Insert(10);

tree.Insert(2);

tree.Insert(3);

tree.Insert(6);

tree.Insert(7);

tree.PrintTreeDFS();

Console.WriteLine("min= "+ tree.Min());

Console.WriteLine("sum = {0}", tree.GetSum());

Console.ReadKey();

}

}

Результат роботи.