C#中的树数据结构
我在C中寻找树或者图数据结构,但我猜没有提供。使用C2.0进行的数据结构的广泛检查解释了一些原因。是否有一个方便使用的库通常用于提供此功能?也许可以通过一种策略模式来解决本文中提出的问题。
我实现自己的树有点愚蠢,就像实现自己的ArrayList一样。
我只想要可以不平衡的通用树。想一想目录树。 C5看起来很漂亮,但是它们的树结构似乎被实现为平衡的红黑树,比表示节点的层次结构更适合于搜索。
解决方案
回答
通常来说非常出色的C5通用收藏库具有几种不同的基于树的数据结构,包括集合,包装袋和字典。如果我们想研究其实现细节,可以使用源代码。 (尽管我没有专门使用任何树结构,但我在生产代码中使用了C5集合,效果很好。)
回答
我最好的建议是,没有标准的树数据结构,因为我们可以通过多种方法来实现它,以至于不可能用一个解决方案覆盖所有基础。解决方案越具体,就越不可能适用于任何给定的问题。我甚至对LinkedList感到恼火,如果我想要一个循环的链表怎么办?
我们需要实现的基本结构将是节点的集合,这是一些入门的选项。假设Node类是整个解决方案的基类。
如果只需要在树上导航,则Node类需要一个子级列表。
如果需要在树上导航,则Node类需要一个指向其父节点的链接。
构建一个AddChild方法,该方法处理这两点的所有细节以及必须实现的任何其他业务逻辑(子级限制,对子级进行排序等)
回答
如果我们想编写自己的文档,则可以从这份分为六部分的文档开始,详细介绍C2.0数据结构的有效用法以及如何分析C#中数据结构的实现。每篇文章都有示例,以及带有示例的安装程序。
Scott Mitchell使用C2.0全面检查数据结构
回答
我不愿承认这一点,但最终还是使用链表编写了自己的树类。在一个不相关的注释上,我刚刚发现了这种圆形物品,当将其连接到我称为"车轴"的物品时,可以更轻松地运输货物。
回答
delegate void TreeVisitor<T>(T nodeData); class NTree<T> { private T data; private LinkedList<NTree<T>> children; public NTree(T data) { this.data = data; children = new LinkedList<NTree<T>>(); } public void AddChild(T data) { children.AddFirst(new NTree<T>(data)); } public NTree<T> GetChild(int i) { foreach (NTree<T> n in children) if (--i == 0) return n; return null; } public void Traverse(NTree<T> node, TreeVisitor<T> visitor) { visitor(node.data); foreach (NTree<T> kid in node.children) Traverse(kid, visitor); } }
简单的递归实现...
<40行代码...
我们只需要在类外部保留对树根的引用,
或者将其包装在另一个类中,也许重命名为TreeNode?
回答
见http://quickgraph.codeplex.com/
QuickGraph为.Net 2.0及更高版本提供通用的有向/无向图数据结构和算法。 QuickGraph带有诸如深度优先搜索,呼吸优先搜索,A *搜索,最短路径,k最短路径,最大流量,最小生成树,最不常见祖先等算法,... QuickGraph支持MSAGL,GLEE和Graphviz渲染图,序列化为GraphML等...