.NET 4.0中是否有内置的二进制搜索树?


70

.NET 4.0中是否有内置的二进制搜索树,还是我需要从头开始构建此抽象数据类型?

编辑

这是专门针对二进制搜索树的,而不是一般的抽象数据类型“树”。



2
@RobertMacLean 6年后,这是骗子吗?大声笑!
Benny Skogberg '16

1
是的,您也知道六年前:stackoverflow.com/a/3262982/53236:P
Robert MacLean

1
@RobertMacLean ...从那时起,.NET不断发展,去年我才知道真正的答案是YES stackoverflow.com/a/34083290/286244 :)
Benny Skogberg

2
然后,基于StackOverflow可编辑的事实,难道不应该有人回来编辑或关闭它们吗?基本上,通过留下一个错误/不完整的旧答案,我们是否会伤害未来的知识猎手?
罗伯特·麦克莱恩

Answers:


67

我认为您正在寻找的SortedSet<T>班级System.Collections.Generic是。

从此CodeProject文章中

它使用 自平衡红黑树实现,其性能复杂度为 O(log n)为插入,删除和查找。它用于使元素保持排序顺序,以获取特定范围内的元素子集,或获取 集合中的MinMax元素。

源代码https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/SortedSet.cs


2
红黑树实际上是一种特殊的二进制搜索树。请参阅我的答案以获取更多详细信息。
穆罕默德·雷汉

11
不幸的是,此类没有提供经典二进制搜索树的许多有用方法,例如lower_bound(std::set在C ++中实现)。当心GetViewBetween方法。出乎意料的是,它具有线性运行时间
renadeen 2015年

这个答案是错误的。SortedSet <T>不是BST。插入和删除的时间复杂度为O(n)。
ataravati

1
SortedSet是二进制搜索树。dotnet开源代码可在github上获得参考。github.com/dotnet/corefx/blob/master/src/System.Collections/src/...
拉维桑卡尔饶


19

问了问题五年后,我意识到在.NET 4.0中确实存在一个内置的二进制搜索树。它可能稍后会添加,并且可以按预期工作。每次插入后,它都会自平衡(移动),这会降低添加大量项目时的性能。

SortedDictionary<TKey, TValue>班有以下几点意见:

SortedDictionary泛型类是具有O(log n)检索的二叉搜索树,其中n是字典中元素的数量。在这方面,它类似于SortedList通用类。这两个类具有相似的对象模型,并且都具有O(log n)检索。


1
为什么需要钥匙(也许您的模型需要钥匙)?SortedSet <T>是否已经涵盖了这个问题(但是没有密钥)?
bbqchickenrobot

@bbqchickenrobot这就是为什么我接受答案SortedSet <T> ;-)
Benny Skogberg

8

不,.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


4

C5集合库(请参阅http://www.itu.dk/research/c5/)包括TreeDictionary<>具有平衡的红黑二叉树的类。注意:我还没有使用过该库,因为我所做的工作只需要标准的.NET集合即可。


好一个。红黑树与普通BinarySearchTrees有点不同,但是仍然是一个非常不错的算法!我将立即为该链接添加书签,并将其保存在我的XMarks帐户中:) Thanx Dr Herbie。
Benny Skogberg'7


2

感谢名单以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();
        }
    }
}

1

我不确定“ tree”到底是什么意思,但是您可以在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 );

谢谢-这对我来说是新信息
-thanx
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.