Есть ли встроенное двоичное дерево поиска в .NET 4.0?

Есть ли встроенное дерево двоичного поиска в .NET 4.0, или мне нужно создать этот абстрактный тип данных с нуля?

Изменить

Это касается дерева двоичного поиска, а не абстрактного типа данных "деревья" в целом.

Ответ 1

Я думаю, что SortedSet<T> в System.Collections.Generic - это то, что вы ищете.

От эта статья CodeProject:

Он реализуется с использованием самобалансирующееся красно-черное дерево, которое дает сложность выполнения O (log n) для вставки, удаления и Погляди. Он используется для элементов в отсортированном порядке, чтобы получить подмножество элементов в определенном диапазон или для получения Мин или Максэлемент набора.

Исходный код https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/SortedSet.cs

Ответ 2

Через пять лет после того, как я задал этот вопрос, я понял, что в .NET 4.0 есть встроенное двоичное дерево поиска. Вероятно, он был добавлен позже и работает так, как ожидалось. Он самостоятельно балансирует (перемещается) после каждой вставки, что снижает производительность при добавлении большого количества предметов.

Класс SortedDictionary<TKey, TValue> имеет следующие замечания:

Общий класс SortedDictionary - это двоичное дерево поиска с извлечением O (log n), где n - количество элементов в словаре. В этом отношении он похож на общий класс SortedList. Эти два класса имеют похожие объектные модели, и оба имеют O (log n).

Ответ 3

можно найти бинарное дерево ACL с балансировкой С# @http://code.google.com/p/self-balancing-avl-tree/. Также реализует логарифмические операции конкатенации и разделения

Ответ 4

Нет,.NET не содержит Двоичное дерево поиска. Он содержит Red-Black Tree, который является специализированным деревом двоичного поиска, в котором каждый node окрашен в красный или черный цвет, и есть определенные правила, использующие эти цвета, которые удерживают дерево сбалансированным и позволяют дереву гарантировать 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

Ответ 5

Я не уверен, что именно вы имеете в виду с "деревом", но вы можете выполнять бинарные поиски в классе 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 );

Ответ 6

Ответ: Нет.

Существуют доступные реализации. Взгляните на следующую ссылку:

Двоичное дерево в С#

Ответ 7

Библиотека C5-коллекций (см. http://www.itu.dk/research/c5/) включает классы TreeDictionary<> со сбалансированными красно-черными двоичными деревьями. Примечание. Я еще не использовал эту библиотеку, так как работа, которую я делаю, больше не нуждается в стандартных сборках .NET.

Ответ 8

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