【问题标题】:Is there a built-in Binary Search Tree in .NET 4.0?.NET 4.0 中是否有内置的二叉搜索树?
【发布时间】:2011-03-16 19:57:18
【问题描述】:

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

编辑

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

【问题讨论】:

  • @RobertMacLean 6 年后,这是骗子?大声笑!
  • 是的,六年前你也知道:stackoverflow.com/a/3262982/53236:P
  • @RobertMacLean ...从那时起,.NET 不断发展,去年我了解到真正的答案是 YES stackoverflow.com/a/34083290/286244 :)
  • 那么基于 StackOverflow 是可编辑的事实,不应该有人回来编辑这些或关闭这些吗?基本上,留下一个不正确/不完整的旧答案,我们不是在伤害未来的知识猎手吗?

标签: c# .net binary-tree


【解决方案1】:

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

该类称为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

【讨论】:

    【解决方案2】:

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

    SortedDictionary&lt;TKey, TValue&gt;类有以下备注:

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

    【讨论】:

    • 为什么需要密钥(也许您的模型需要它)? SortedSet 不是已经涵盖了这个(但没有密钥)吗?
    • @bbqchickenrobot 这就是为什么我接受了 SortedSet 的答案 ;-)
    【解决方案3】:

    我认为System.Collections.Generic 中的SortedSet&lt;T&gt; 类是您正在寻找的。​​p>

    来自this CodeProject article

    它是使用 自平衡红黑树 给出了性能复杂度 O(log n) 用于插入、删除和 抬头。它用于保持 排序后的元素,得到 特定元素的子集 范围,或获取 MinMax 集合的元素。

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

    【讨论】:

    • 红黑树实际上是一种特殊的二叉搜索树。有关详细信息,请参阅我的答案。
    • 不幸的是,这个类没有提供许多经典二叉搜索树的有用方法,例如。 G。 lower_bound(在 C++ 中的 std::set 中实现)。当心 GetViewBetween 方法。没想到居然有linear running time
    • 这个答案是错误的。 SortedSet 不是 BST。插入和删除的时间复杂度为 O(n)。
    • SortedSet 是一个二叉搜索树。 dotnet 开源代码可在 github 上获取以供参考。 github.com/dotnet/corefx/blob/master/src/System.Collections/src/…
    • 这对列表docs.microsoft.com/en-us/dotnet/api/…使用二进制搜索
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • 不错的一个。红黑树与普通的 BinarySearchTrees 有点不同,但仍然是一个非常好的算法!我会立即为该链接添加书签,并将其保存在我的 XMarks 帐户中:) 感谢 Herbie 博士。
        【解决方案7】:

        答案是:不。

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

        Binary Tree in C#

        【讨论】:

        • 奇怪的是,我在二叉搜索树上提问时没有得到那个建议。谢谢莱尼尔!
        【解决方案8】:

        我不确定您对“树”的确切含义,但您可以对 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 - 这对我来说是新信息 -thanx
        猜你喜欢
        • 1970-01-01
        • 2023-03-08
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-16
        • 2012-06-05
        • 1970-01-01
        相关资源
        最近更新 更多