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

LBu*_*kin 82 .net c# data-structures

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

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

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

Jas*_*son 67

你可以定义自己的:

public class MyTree<K, V> : Dictionary<K, MyTree<K, V>>
{
    public V Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

或者没有密钥:

public class MyTree<V> : HashSet<MyTree<V>>
{
    public V Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意元素是以这种方式取消订购的 (2认同)
  • 我很好奇。你如何使用这个?几乎?有样品吗? (2认同)

Alu*_*ord 36

你想从这样的实现中得到什么?

二叉树?红黑?基数树?B树?R树?R* - 树?

树更像是一种模式而不是数据结构,并且它们倾向于在性能很重要的地方使用(因此实现细节也可能很重要).如果BCL包含某种树类,那么你只需要自己滚动

  • 在一个平行的宇宙中,有人问的问题是:"为什么.Net中没有列表类型?",他们得到答案:"你想从这样的实现中得到什么?一个数组?一个链表?一个队列?A字典?" 我认为这是一个非常有效的答案. (8认同)
  • 问题“为什么”部分的最佳答案。 (2认同)

Joh*_*lla 29

你是对的,BCL里什么都没有.我怀疑这是因为选择是否使用树通常是实现细节,否则是访问数据的非常规方式.也就是说,你没有说,"二元搜索元素#37"; 相反,你说,"给我元素#37".

但是你看过C5了吗?这是超级方便,他们有几个树实现(1,2,3).

  • C5支持红黑树而不是B树.它们是人们应该意识到的差异.对于基于磁盘的树或基于大型内存的树,B树更为理想.更多节点保存在同一位置,因此您可以获得更好的处理器缓存性能,并且可以更快地读取写入磁盘. (3认同)

小智 15

我相信,SortedDictionary作为log(n)插入,您可以从树数据结构中获得的检索特征.

http://msdn.microsoft.com/en-us/library/f7fta44c(VS.80).aspx


Mat*_*ell 12

SortedSet<T>实现为二叉搜索树ref.SortedDictionary<TKey, TValue>内部使用SortedSet<T>它也是二元搜索树引用.

  • 不幸的是,这些只是有序地图和列表的实现.这两种树结构都只是集合的实现细节.我实际上正在寻找一个暴露树结构的类. (5认同)

And*_*are 8

不,Tree<T>BCL中没有任何" 类似"的类型(一直困扰着我的东西)但这里有一篇很好的文章,将引导您在C#中实现自己的类型.

我想你可以说,基于树的数据结构不常用于.NET通常用于的应用程序(业务应用程序,数据移动应用程序等).不过,我同意你的看法,BCL根本没有实施,这很奇怪.