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

时间:2010-07-16 07:57:40

标签: c# .net binary-tree

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

修改

这是关于二进制搜索树的,而不是抽象数据类型“树”。

8 个答案:

答案 0 :(得分:53)

我认为System.Collections.Generic中的SortedSet<T>课程正是您所寻找的。

来自this CodeProject article

  

使用a实现   自我平衡的红黑树那   给出了性能复杂性    O(log n)用于插入,删除和   抬头。它用于保持   按顺序排列的元素,以获得   特定元素的子集   范围,或获得最小最大   集合的元素。

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

答案 1 :(得分:18)

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

SortedDictionary<TKey, TValue> 类有以下备注:

  

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

答案 2 :(得分:7)

不,.NET不包含Binary Search Tree。它确实包含一个Red-Black Tree,它是一种特殊的二进制搜索树,其中每个节点都涂成红色或黑色,并且使用这些颜色有一定的规则可以保持树的平衡,并允许树保证 O (登录)搜索时间。标准二进制搜索树无法保证这些搜索时间。

该类称为SortedSet<T>,并在.NET 4.0中引入。您可以查看它的源代码here。以下是它的一个使用示例:

// 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

答案 3 :(得分:6)

可以找到一个C#平衡的AVL二叉树@ http://code.google.com/p/self-balancing-avl-tree/。它还实现了对数连接和拆分操作

答案 4 :(得分:3)

答案是:否。

虽然有可用的实现。请看以下链接:

Binary Tree in C#

答案 5 :(得分:3)

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

答案 6 :(得分:2)

我不确定你对'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 );

答案 7 :(得分:2)

Thanx到 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();
        }
    }
}