4. Арифметичні операції з елементами дерева
Поширеними алгоритмами роботи з бінарним деревом пошуку є знаходження суми елементів дерева, суми елементів у листах (кінцевих вузлах).
Проблема реалізації цих алгоритмів у C# полягає в тому, що клас BinarySearchTree<T> є універсальним, а в таких класах не визначені арифметичні операції.
Рішення проблеми:
Створити одразу конкретні класи дерева і вузла.
Створити похідний клас, який конкретизує універсальний.
Розглянемо другий варіант рішення. Створимо для прикладу 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();
}
}
Результат роботи.
