.NET中的基类库为集合(List,Queue,Stack,Dictionary)提供了一些出色的数据结构,但奇怪的是它不包含二进制树的任何数据结构。对于某些算法,例如利用不同遍历路径的算法,这是非常有用的结构。我正在寻找一个正确编写的免费实现。
我只是瞎了,没找到它......它被埋在BCL的某个地方吗?如果没有,有人可以为二进制树推荐免费或开源的C#/。NET库吗?优选使用泛型的。
编辑:澄清我在寻找什么。我对内部使用树的有序字典集合不感兴趣。我实际上对二叉树感兴趣 - 一个公开其结构的树,以便您可以执行诸如提取子树或在节点上执行修复后遍历等操作。理想情况下,这样的类可以扩展为提供专门树的行为(即红/黑,AVL,平衡等)。
答案 0 :(得分:67)
您可以定义自己的:
public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
public V Value { get; set; }
}
或者没有密钥:
public class MyTree<V> : HashSet<MyTree<V>>
{
public V Value { get; set; }
}
答案 1 :(得分:37)
您希望从这样的实施中获得什么?
二叉树? 红黑? 基数树? B树? R树? R * -tree?
树更像是一种模式而不是数据结构,它们倾向于在性能很重要的地方使用(因此实现细节也很重要)。如果BCL包含某种树类,那么你只需要自己滚动
答案 2 :(得分:29)
你是对的,BCL里什么都没有。我怀疑这是因为选择是否使用树通常是实现细节,否则是访问数据的非常规方式。也就是说,你没有说,“二元搜索元素#37”;相反,你说,“给我元素#37”。
答案 3 :(得分:14)
我相信SortedDictionary
作为log(n)插入,是您期望从树数据结构中获取的特征。
http://msdn.microsoft.com/en-us/library/f7fta44c(VS.80).aspx
答案 4 :(得分:12)
SortedSet<T>
实现为二元搜索树 ref 。 SortedDictionary<TKey, TValue>
内部使用SortedSet<T>
,因此它也是二元搜索树 ref 。
答案 5 :(得分:8)
不,BCL中没有任何类似“Tree<T>
”的类型(一直困扰我的东西),但是here is a good article将引导您在C#中实现自己的类型。
我想你可以说,基于树的数据结构不常用于.NET通常用于的应用程序(业务应用程序,数据移动应用程序等)。不过,我同意你的看法,BCL根本没有实施,这很奇怪。
答案 6 :(得分:1)
当我不得不自己编写第3和第4部分时,这一系列文章对我有帮助。
答案 7 :(得分:-5)
您可以使用TreeNode。它不是通用的,隐藏在Windows窗体中并与treeview控件一起使用,但您也可以在其他地方使用它。