Я искал древовидную или графическую структуру данных в C #, но, по-моему, ее нет. Обширный анализ структур данных с использованием C # 2.0 объясняет немного, почему. Есть ли удобная библиотека, которая обычно используется для обеспечения этой функциональности? Возможно, через шаблон стратегии для решения вопросов, представленных в статье.
Я чувствую себя немного глупо, реализуя свое собственное дерево, так же, как я реализую свой собственный ArrayList.
Я просто хочу общее дерево, которое может быть несбалансированным. Подумайте о дереве каталогов. C5 выглядит изящно, но их древовидные структуры кажутся реализованными в виде сбалансированных красно-черных деревьев, которые лучше подходят для поиска, чем для представления иерархии узлов.
c#
data-structures
stimms
источник
источник
public class Tree<T> : List<Tree<T>> { public T Value; }
.Ответы:
Мой лучший совет: стандартная древовидная структура данных не существует, потому что есть так много способов ее реализовать, что невозможно охватить все базы одним решением. Чем конкретнее решение, тем менее вероятно, что оно применимо к любой конкретной проблеме. Меня даже раздражает LinkedList - что если я хочу круглый список ссылок?
Базовая структура, которую вам нужно реализовать, будет набором узлов, и вот несколько вариантов, с которых можно начать. Давайте предположим, что класс Node является базовым классом всего решения.
Если вам нужно перемещаться только по дереву, то классу Node необходим список дочерних элементов.
Если вам нужно перемещаться вверх по дереву, то классу Node нужна ссылка на его родительский узел.
Создайте метод AddChild, который позаботится обо всех мелочах этих двух точек и любой другой бизнес-логике, которая должна быть реализована (дочерние ограничения, сортировка дочерних элементов и т. Д.)
источник
Простая рекурсивная реализация ... <40 строк кода ... Вам просто нужно сохранить ссылку на корень дерева вне класса или обернуть его в другом классе, возможно, переименовать в TreeNode ??
источник
Action<T>
делегат:public void traverse(NTree<T> node, Action<T> visitor)
. Действие <> 's подпись:void Action<T>( T obj )
. Также есть версии от 0 до 4 разных параметров. Также есть аналогичный делегат для вызываемых функцийFunc<>
.--i == 0
будет функционировать только в одном случае? Это правда. ЭтоВот мой, который очень похож на Аарона Гейджа , на мой взгляд, немного более обычный. В моих целях у меня не было проблем с производительностью
List<T>
. Было бы достаточно легко переключиться на LinkedList, если это необходимо.источник
public TreeNode<T> InsertChild(TreeNode<T> parent, T value) { var node = new TreeNode<T>(value) { Parent = parent }; parent._children.Add(node); return node; }
var five = myTree.AddChild(5); myTree.InsertChild(five, 55);
Еще одна древовидная структура:
Пример использования:
БОНУС
Видеть полноценное дерево с:
https://github.com/gt4dev/yet-another-tree-structure
источник
node
берутся? Значит ли это, что мне нужно перебирать дерево, чтобы использовать код поиска?IEnumerable<>
члены, поэтому он не компилируется.В целом отличная библиотека C5 Generic Collection Library имеет несколько различных древовидных структур данных, включая наборы, пакеты и словари. Исходный код доступен, если вы хотите изучить детали их реализации. (Я использовал коллекции C5 в производственном коде с хорошими результатами, хотя я специально не использовал ни одну из древовидных структур.)
источник
Смотрите http://quickgraph.codeplex.com/
QuickGraph предоставляет общие структуры и алгоритмы ориентированных / неориентированных графов для .Net 2.0 и выше. QuickGraph поставляется с такими алгоритмами, как поиск по глубине, поиск по дыханию, поиск A *, кратчайший путь, k-кратчайший путь, максимальный поток, минимальное связующее дерево, наименьшие общие предки и т. Д. QuickGraph поддерживает MSAGL, GLEE и Graphviz для рендеринг графиков, сериализация в GraphML и т. д.
источник
Если вы хотите написать свой собственный, вы можете начать с этого документа, состоящего из шести частей, подробно описывающего эффективное использование структур данных C # 2.0 и как анализировать реализацию ваших структур данных в C #. В каждой статье есть примеры и установщик с образцами, за которыми вы можете следить.
«Обширный анализ структур данных с использованием C # 2.0» Скотта Митчелла
источник
У меня есть небольшое расширение для решений.
Используя рекурсивное обобщенное объявление и производный подкласс, вы можете лучше сконцентрироваться на своей реальной цели.
Обратите внимание, что это отличается от неуниверсальной реализации, вам не нужно приводить 'node' в 'NodeWorker'.
Вот мой пример:
источник
Вот мой собственный:
Вывод:
источник
Попробуйте этот простой пример.
источник
Я создаю класс Node, который может быть полезен для других людей. Класс имеет такие свойства, как:
Существует также возможность преобразовать плоский список элементов с Id и ParentId в дерево. Узлы содержат ссылку как на дочерние, так и на родительские элементы, что делает итерацию узлов достаточно быстрой.
источник
Поскольку это не упомянуто, я хотел бы, чтобы вы обратили внимание на уже выпущенную кодовую базу .net: в частности, код для,
SortedSet
который реализует Red-Black-Tree:https://github.com/Microsoft/referencesource/blob/master/System/compmod/system/collections/generic/sortedset.cs
Это, однако, сбалансированная древовидная структура. Поэтому мой ответ - скорее ссылка на то, что я считаю единственной нативной древовидной структурой в базовой библиотеке .net.
источник
Я выполнил код, которым поделился @Berezh.
источник
Вот дерево
Вы даже можете использовать инициализаторы:
источник
Большинство деревьев сформированы данными, которые вы обрабатываете.
Другой пример - дерево разбора в компиляторе…
Оба этих примера показывают, что концепция дерева является частью домена данных, и использование отдельного дерева общего назначения по крайней мере удваивает количество создаваемых объектов, а также усложняет программирование API.
Нам нужен способ многократного использования стандартных операций с деревом, без необходимости повторной реализации их для всех деревьев, и в то же время без необходимости использовать стандартный класс дерева. Boost пытался решить проблему такого типа для C ++, но я пока не вижу каких-либо эффектов для .NET.
источник
Я добавил полное решение и пример, используя класс NTree выше, а также добавил метод "AddChild" ...
с помощью
источник
Вот моя реализация BST
источник
Если вы собираетесь отображать это дерево в графическом интерфейсе, вы можете использовать TreeView и TreeNode . (Полагаю, технически вы можете создать TreeNode, не помещая его в графический интерфейс, но он имеет больше накладных расходов, чем простая реализация TreeNode.)
источник
Если вам нужна реализация структуры данных с корневым деревом, которая использует меньше памяти, вы можете написать свой класс Node следующим образом (реализация C ++):
источник