Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 20:24   #1
Andrey_k
Пользователь
 
Регистрация: 28.04.2009
Сообщений: 11
По умолчанию Дерево на C#

Здравствуйте! Помогите пожалуйста с задачей.
Разработать обобщенный класс Tree<T> и сопутствующие классы, описывающие дерево с произвольным числом потомков в каждом узле:
Цитата:
1. Node<T>
o методы:
void Add(Node<T> node); //добавление узла
void Add(T value); //добавление узла по значению
int Remove(Node<T> node) – возвращает количество удаленных элементов;
int Remove(T node) – возвращает количество удаленных элементов;
void Clear(); //Очистка дерева
void SortNodes(CompareDelegate<T>); //Сортировка узлов
o свойства
int ChildCount; //Количество потомков (сделано)
Node<T> Parent; (сделано)
Tree<T> Tree; (сделано)
bool isEmpty; //Проверка, есть ли в дереве элементы
2. Tree<T>: Node<T>
o методы
ForEach(WalkType type, ActionDelegate<Node<T>>);
ForEach(WalkType type, ActionDelegate<T>);
3. WalkType = (PreOrder, InOrder, PostOrder, BreadthFirst) – (методы обхода: сверху вниз, слева направо, снизу вверх, в ширину);
4. TreeException – класс, описывающий исключения, которые могут происходить в ходе работы c деревом.
Эти методы и свойства обязательно должны быть.
Пока сделал следующее:
Структура узла дерева:

Код:
public T value;  //значение
public List<Node<T>> children;  //список потомков
public Node<T> parent;  //родительский элемент
Пока интересует только добавление элемента в дерево (метод Add).

Никак не получается найти узел, к которому присоединить элемент.
Я собирался делать так, чтобы дерево было отсортировано. Чем меньше элемент, тем левее он находится. Проблема в том, что используется обобщённый тип и не удаётся отсортировать элементы. С использованием делегатов ничего не получается.
Пример кода:
Код:
public void Add(Node<T> node, Node<T> tree)
		{
			List<Node<T>> temp = new List<Node<T>>();
			for (int i = 0; i < maxChildCount; i++)
			{
				if (tree.children[i]!=null)
					if (tree.children[i].children.Count == 0)
						temp.Add(node.children[i]); 
					else
						Add(node,tree.children[i]);
			}
			//После этого список temp должен содержать все крайние элементы.
			//Среди них я хотел бы выбрать наиболее близкий по значению и к нему добавить новый, но
			//никак не получается сравнить их между собой			
		}

Последний раз редактировалось Andrey_k; 13.03.2010 в 20:55.
Andrey_k вне форума Ответить с цитированием
Старый 13.03.2010, 22:06   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

При объявлении обощенного класса нужно указать ограничение - тип реализует интерфейс IComparable. Тогда для value можно будет вызвать метод CompareTo. Например:

Код:
    public class Node<T> where T: IComparable 
    {
        public T value; 
        public void Add(Node<T> N1, Node<T> N2)
        {
            N1.value.CompareTo(N2.value);
alexBlack вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дерево С# Natok Помощь студентам 0 14.09.2009 23:42
Двоичное дерево afeg Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2008 14:49
Дерево MAcK Общие вопросы Delphi 7 13.06.2008 17:30
Дерево Rifler Паскаль, Turbo Pascal, PascalABC.NET 1 06.05.2008 08:42
Дерево Yoger БД в Delphi 3 25.01.2007 01:24