为什么.NET中没有Tree <t>类?</t>

时间:2009-06-02 21:44:26

标签: c# .net data-structures

.NET中的基类库为集合(List,Queue,Stack,Dictionary)提供了一些出色的数据结构,但奇怪的是它不包含二进制树的任何数据结构。对于某些算法,例如利用不同遍历路径的算法,这是非常有用的结构。我正在寻找一个正确编写的免费实现。

我只是瞎了,没找到它......它被埋在BCL的某个地方吗?如果没有,有人可以为二进制树推荐免费或开源的C#/。NET库吗?优选使用泛型的。

编辑:澄清我在寻找什么。我对内部使用树的有序字典集合不感兴趣。我实际上对二叉树感兴趣 - 一个公开其结构的树,以便您可以执行诸如提取子树或在节点上执行修复后遍历等操作。理想情况下,这样的类可以扩展为提供专门树的行为(即红/黑,AVL,平衡等)。

8 个答案:

答案 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”。

但是你看过C5了吗?它非常方便,并且有多个树实现(123)。

答案 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部分时,这一系列文章对我有帮助。

An Extensive Examination of Data Structures

答案 7 :(得分:-5)

您可以使用TreeNode。它不是通用的,隐藏在Windows窗体中并与treeview控件一起使用,但您也可以在其他地方使用它。