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


87

.NET中的基类库具有一些出色的集合数据结构(列表,队列,堆栈,字典),但奇怪的是,它不包含任何用于二叉树的数据结构。对于某些算法,例如利用不同遍历路径的算法,这是非常有用的结构。我正在寻找正确编写的免费实现。

我只是盲目而没有找到它吗...它埋在BCL中的某个地方吗?如果不是,那么有人可以为二进制树推荐一个免费的或开源的C#/。NET库吗?最好是采用泛型的。

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


同意 我有时需要(在O(Log N)时间内)找到绑定一个值的两个节点(当在集合中找不到该值时)。例如,集合(树)包含13和17(除其他外),而我正在寻找小于和小于16的最大值。一棵树可以做到这一点,但是字典,排序列表和哈希表的取值为O(N) 。
Les

Answers:


31

没错,BCL中没有任何内容。我怀疑这是因为选择是否使用树通常是实现细节,否则是访问数据的非常规方式。也就是说,您不会说“ binary-search-for element#37”;而是说“让我的元素#37”。

但是您看过C5吗?这是超级方便,他们有几个树实现(123)。


3
C5支持红黑树而不是B树。它们是人们应该意识到的差异。对于基于磁盘的树或基于大内存的树,B树是最佳选择。更多的节点保持在相同的位置,因此您可以获得更好的处理器缓存性能,并且更快地读取写入磁盘。
AnthonyLambert 2010年

68

您可以定义自己的:

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; }
}

但是,这需要您知道在编译时将处理多少个树级别,我错了吗?
Veverke '16

1
不,C#编译器支持此语法。
杰森

2
当心元素是无序的
塞巴斯蒂安

@Veverke也许您正在考虑C ++模板。.NET泛型是运行时类型。
汤姆·布洛杰特16/09/29

我很好奇。你如何使用这个?几乎?有样品吗?
Syaiful Nizam Yahya

39

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

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

树比数据结构更像是一种模式,它们通常用于性能很重要的地方(因此实现细节也可能很重要)。如果BCL包含某种树类,则无论如何您只需要自己滚动


1
问题“为什么”部分的最佳答案。
Joel Coehoorn

这些只是搜索树。还有表情树,决策树……
Henk Holterman

实际上,实施细节很重要。就我而言,我正在寻求实现一些算法,这些算法将对一系列有组织的数据执行不同的遍历(中缀,后缀),作为一系列转换的一部分。树形结构是解决我的问题的最优雅的方式。
LBushkin

11
在并行Universe中,有人问一个问题:“。Net为什么没有列表类型?”,他们得到的答案是:“您希望从这样的实现中得到什么?数组?链接列表?队列?字典?” 我认为这不是一个必然的答案。
rymdsmurf '16



9

不,Tree<T>BCL中没有任何“ -like”类型(这也总是困扰我),但这是一篇好文章,它将引导您逐步实现自己在C#中的实现。

我猜您可能会提出一个论点,即基于树的数据结构在.NET通常用于的应用程序(业务应用程序,数据移动应用程序等)中使用较少。尽管如此,我也同意您的看法,但是BCL根本没有实现,这很奇怪。



-5

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


是的,但是它只有System.Object ype的Tag属性。没有通用的<T>参数
Henk Holterman

3
我总是对做这样的事情感到奇怪。在您的特定示例中看不到它,但是如果人们例行地从依赖关系中重新分配类,这可能会导致难以解释的依赖关系,并且如果重新分配的类以意想不到的方式发生变化,可能会给您带来麻烦依赖版本。
Paul Morie 09年

4
使用它会有什么好处?树节点通常没有任何相关功能。它仅包含对孩子的引用,并最终包含对父母的引用。没有理由为此滥用System.Windows.Forms类!只需自己编写即可-一分钟或更短的时间。
user492238 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.