[英]Is there a built-in Binary Search Tree in .NET 4.0?
.NET 4.0 中是否有内置的二叉搜索树,还是我需要从头开始构建这种抽象数据类型?
这具体是关于二叉搜索树,而不是一般的抽象数据类型“树”。
我认为System.Collections.Generic
中的SortedSet<T>
类是您正在寻找的。
它是使用自平衡红黑树实现的,该树为插入、删除和查找提供了O(log n)的性能复杂度。 它用于保持元素排序,获取特定范围内元素的子集,或获取集合的最小或最大元素。
在我提出这个问题五年后,我意识到 .NET 4.0 中确实有一个内置的二叉搜索树。 它可能是稍后添加的,并且可以按预期工作。 它在每次插入后进行自我平衡(遍历),这会降低添加大量项目时的性能。
SortedDictionary<TKey, TValue>
类有以下备注:
SortedDictionary 泛型类是具有 O(log n) 检索的二叉搜索树,其中 n 是字典中的元素数。 在这方面,它类似于 SortedList 泛型类。 这两个类具有相似的对象模型,并且都具有 O(log n) 检索。
不,.NET 不包含二叉搜索树。 它确实包含一个红黑树,它是一种特殊的二叉搜索树,其中每个节点都被涂成红色或黑色,并且使用这些颜色有一些规则可以保持树的平衡并允许树保证O(logn)搜索次。 标准的二叉搜索树不能保证这些搜索时间。
该类称为SortedSet<T>
并在 .NET 4.0 中引入。 你可以在这里查看它的源代码。 这是它的使用示例:
// Created sorted set of strings.
var set = new SortedSet<string>();
// Add three elements.
set.Add("net");
set.Add("net"); // Duplicate elements are ignored.
set.Add("dot");
set.Add("rehan");
// Remove an element.
set.Remove("rehan");
// Print elements in set.
foreach (var value in set)
{
Console.WriteLine(value);
}
// Output is in alphabetical order:
// dot
// net
可以在http://code.google.com/p/self-balancing-avl-tree/上找到一个C#平衡的AVL二叉树。它还实现了对数连接和拆分操作
C5 集合库(参见http://www.itu.dk/research/c5/ )包括具有平衡红黑二叉树的TreeDictionary<>
类。 注意:我还没有使用过这个库,因为我所做的工作只需要标准的 .NET 集合。
感谢 herzmeister der welten ,我现在知道有! 我试过了,真的很管用!
namespace Tree
{
public partial class Form1 : Form
{
private SortedSet<int> binTree = new SortedSet<int>();
public Form1()
{
InitializeComponent();
}
private void Insert(int no)
{
binTree.Add(no);
}
private void Print()
{
foreach (int i in binTree)
{
Console.WriteLine("\t{0}", i);
}
}
private void btnAdd_Click(object sender, EventArgs e)
{
Insert(Int32.Parse(tbxValue.Text));
tbxValue.Text = "";
}
private void btnPrint_Click(object sender, EventArgs e)
{
Print();
}
}
}
我不确定您对“树”的确切含义,但您可以在 List 类上进行二进制搜索。
public int BinarySearch( T item );
public int BinarySearch( T item, IComparer<T> comparer );
public int BinarySearch( int index, int count, T item, IComparer<T> comparer );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.