繁体   English   中英

.NET 4.0 中有内置的二叉搜索树吗?

[英]Is there a built-in Binary Search Tree in .NET 4.0?

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

编辑

这具体是关于二叉搜索树,而不是一般的抽象数据类型“树”。

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

从此CodeProject 文章

它是使用自平衡红黑树实现的,该树为插入、删除和查找提供了O(log n)的性能复杂度。 它用于保持元素排序,获取特定范围内元素的子集,或获取集合的最小最大元素。

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

在我提出这个问题五年后,我意识到 .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 集合。

答案是不。

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

C#中的二叉树

感谢 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM