.NET 4.0中是否有内置的二进制搜索树,还是我需要从头开始构建此抽象数据类型?
编辑
这是专门针对二进制搜索树的,而不是一般的抽象数据类型“树”。
.NET 4.0中是否有内置的二进制搜索树,还是我需要从头开始构建此抽象数据类型?
这是专门针对二进制搜索树的,而不是一般的抽象数据类型“树”。
Answers:
我认为您正在寻找的SortedSet<T>
班级System.Collections.Generic
是。
它使用 自平衡红黑树实现,其性能复杂度为 O(log n)为插入,删除和查找。它用于使元素保持排序顺序,以获取特定范围内的元素子集,或获取 集合中的Min或Max元素。
std::set
在C ++中实现)。当心GetViewBetween方法。出乎意料的是,它具有线性运行时间
问了问题五年后,我意识到在.NET 4.0中确实存在一个内置的二进制搜索树。它可能稍后会添加,并且可以按预期工作。每次插入后,它都会自平衡(移动),这会降低添加大量项目时的性能。
该SortedDictionary<TKey, TValue>
班有以下几点意见:
SortedDictionary泛型类是具有O(log n)检索的二叉搜索树,其中n是字典中元素的数量。在这方面,它类似于SortedList通用类。这两个类具有相似的对象模型,并且都具有O(log n)检索。
不,.NET不包含二进制搜索树。它确实包含一棵红黑树,这是一种特殊的二进制搜索树,其中的每个节点都被涂成红色或黑色,并且使用这些颜色的某些规则使树保持平衡并允许树保证O(logn)搜索次。标准的二进制搜索树不能保证这些搜索时间。
该类称为a 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德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();
}
}
}