Je cherchais une structure de données arborescente ou graphique en C # mais je suppose qu'il n'y en a pas une fournie. Un examen approfondi des structures de données à l'aide de C # 2.0 explique un peu pourquoi. Existe-t-il une bibliothèque pratique couramment utilisée pour fournir cette fonctionnalité? Peut-être grâce à un modèle de stratégie pour résoudre les problèmes présentés dans l'article.
Je me sens un peu idiot d'implémenter mon propre arbre, tout comme j'implémenterais ma propre ArrayList.
Je veux juste un arbre générique qui peut être déséquilibré. Pensez à une arborescence de répertoires. C5 semble astucieux, mais leurs structures arborescentes semblent être mises en œuvre comme des arbres rouges-noirs équilibrés mieux adaptés à la recherche qu'à la représentation d'une hiérarchie de nœuds.
la source
Réponses:
Mon meilleur conseil serait qu'il n'y ait pas de structure de données arborescente standard car il y a tellement de façons de l'implémenter qu'il serait impossible de couvrir toutes les bases avec une seule solution. Plus une solution est spécifique, moins elle est applicable à un problème donné. Je m'énerve même avec LinkedList - et si je veux une liste chaînée circulaire?
La structure de base que vous devrez implémenter sera une collection de nœuds, et voici quelques options pour vous aider à démarrer. Supposons que la classe Node est la classe de base de la solution entière.
Si vous avez uniquement besoin de naviguer dans l'arborescence, une classe Node a besoin d'une liste d'enfants.
Si vous devez naviguer dans l'arborescence, la classe Node a besoin d'un lien vers son nœud parent.
Construisez une méthode AddChild qui prend en charge toutes les minuties de ces deux points et toute autre logique métier qui doit être implémentée (limites enfants, tri des enfants, etc.)
la source
Implémentation récursive simple ... <40 lignes de code ... Vous avez juste besoin de garder une référence à la racine de l'arbre en dehors de la classe, ou de l'envelopper dans une autre classe, peut-être renommer TreeNode ??
la source
Action<T>
délégué:public void traverse(NTree<T> node, Action<T> visitor)
. L' action de la signature <> est:void Action<T>( T obj )
. Il existe également des versions de 0 à 4 paramètres différents. Il existe également un délégué analogue pour les fonctions appeléesFunc<>
.--i == 0
ne fonctionnera qu'en cas unique? Est-ce vrai. Cela m'a rendu confusVoici le mien, qui est très similaire à celui d' Aaron Gage , un peu plus conventionnel à mon avis. Pour mes besoins, je n'ai rencontré aucun problème de performance avec
List<T>
. Il serait assez facile de passer à une LinkedList si nécessaire.la source
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);
Encore une autre structure arborescente:
Exemple d'utilisation:
BONUS
Voir l'arbre à part entière avec:
https://github.com/gt4dev/yet-another-tree-structure
la source
node
vient-il? Cela signifie-t-il que je dois parcourir l’arbre pour utiliser le code de recherche?IEnumerable<>
membres, donc il ne compile pas.La bibliothèque de collections génériques C5, généralement excellente, possède plusieurs structures de données arborescentes différentes, y compris des ensembles, des sacs et des dictionnaires. Le code source est disponible si vous souhaitez étudier leurs détails d'implémentation. (J'ai utilisé des collections C5 dans le code de production avec de bons résultats, même si je n'ai utilisé aucune des arborescences spécifiquement.)
la source
Voir http://quickgraph.codeplex.com/
QuickGraph fournit des infrastructures de données et des algorithmes génériques de graphes dirigés / non dirigés pour .Net 2.0 et versions ultérieures. QuickGraph est livré avec des algorithmes tels que la profondeur de la première recherche, la recherche du premier souffle, la recherche A *, le chemin le plus court, le chemin le plus court k, le débit maximal, l'arbre minimal, les ancêtres les moins courants, etc. QuickGraph prend en charge MSAGL, GLEE et Graphviz pour rendre les graphes, la sérialisation en GraphML, etc ...
la source
Si vous souhaitez écrire le vôtre, vous pouvez commencer par ce document en six parties détaillant l'utilisation efficace des structures de données C # 2.0 et comment analyser votre implémentation des structures de données en C #. Chaque article contient des exemples et un programme d'installation avec des exemples que vous pouvez suivre.
«Un examen approfondi des structures de données à l'aide de C # 2.0» par Scott Mitchell
la source
J'ai une petite extension aux solutions.
En utilisant une déclaration générique récursive et une sous-classe dérivée, vous pouvez mieux vous concentrer sur votre cible réelle.
Remarquez, c'est différent d'une implémentation non générique, vous n'avez pas besoin de transtyper 'node' dans 'NodeWorker'.
Voici mon exemple:
la source
Voici le mien:
Production:
la source
Essayez cet exemple simple.
la source
Je crée une classe Node qui pourrait être utile pour d'autres personnes. La classe a des propriétés comme:
Il y a aussi la possibilité de convertir une liste plate d'éléments avec un Id et un ParentId en arbre. Les nœuds contiennent une référence à la fois aux enfants et au parent, ce qui rend l'itération des nœuds assez rapide.
la source
Parce qu'il n'est pas mentionné, je voudrais que vous attiriez l'attention sur la base de code .net maintenant publiée: spécifiquement le code pour un
SortedSet
qui implémente un Red-Black-Tree:https://github.com/Microsoft/referencesource/blob/master/System/compmod/system/collections/generic/sortedset.cs
Il s'agit cependant d'une structure arborescente équilibrée. Donc ma réponse est plus une référence à ce que je crois être la seule arborescence native de la bibliothèque de base .net.
la source
J'ai complété le code que @Berezh a partagé.
la source
Voici un arbre
Vous pouvez même utiliser des initialiseurs:
la source
La plupart des arbres sont formés par les données que vous traitez.
Un autre exemple est un arbre d'analyse dans un compilateur…
Ce que ces deux exemples montrent, c'est que le concept d'arbre fait partie du domaine des données et que l'utilisation d'une arborescence à usage général distincte au moins double le nombre d'objets qui sont créés et rend l'API plus difficile à programmer à nouveau.
Ce que nous voulons, c'est un moyen de réutiliser les opérations d'arbre standard, sans avoir à les réimplémenter pour tous les arbres, tout en n'ayant pas à utiliser une classe d'arbre standard. Boost a essayé de résoudre ce type de problème pour C ++, mais je n'ai encore vu aucun effet pour .NET s'adapter.
la source
J'ai ajouté une solution complète et un exemple en utilisant la classe NTree ci-dessus, j'ai également ajouté la méthode "AddChild" ...
en utilisant
la source
Voici mon implémentation de BST
la source
Si vous allez afficher cette arborescence sur l'interface graphique, vous pouvez utiliser TreeView et TreeNode . (Je suppose que techniquement, vous pouvez créer un TreeNode sans le mettre sur une interface graphique, mais il a plus de surcharge qu'une simple implémentation TreeNode maison.)
la source
Si vous avez besoin d'une implémentation de structure de données d'arborescence enracinée qui utilise moins de mémoire, vous pouvez écrire votre classe Node comme suit (implémentation C ++):
la source