Я использую нечто похожее на это в универсальном красно-черном дереве, которое я использую. По сути, для начала вам нужен класс-оболочка типа Tree, который содержит фактические узлы.
Это основано на возможности ссылаться на дерево по индексу
Таким образом, вы можете сделать что-то вроде следующего, чтобы настроить дерево с ключом, значением
class Tree<K, V>
{
//constructors and any methods you need
//Access the Tree like an array
public V this[K key]
{
get {
//This works just like a getter or setter
return SearchForValue(key);
}
set {
//like a setter, you can use value for the value given
if(SearchForValue(key) == null)
{
// node for index doesn't exist, add it
AddValue(key, value);
} else { /* node at index already exists... do something */ }
}
}
Это работает при условии, что вы уже знаете, как создать дерево, но хотите иметь возможность делать такие вещи, как доступ к дереву по индексу. Теперь вы можете сделать что-то вроде этого:
Tree<string,string> t = new Tree<string,string>();
t["a"] = "Hello World";
t["b"] = "Something else";
Console.Writeline("t at a is: {0}", t["a"]);
Наконец, для обеспечения безопасности потоков вы можете добавить объект к вашему классу Tree, и для любого метода, доступного внешнему миру, просто вызовите
Lock(threadsafetyobject) { /*Code you're protecting */ }
Наконец, если вы хотите что-то более прохладное для обеспечения безопасности потоков, я использую в своем дереве объект, называемый ReaderWriterLockSlim , который допускает многократное чтение, но блокируется, когда вы хотите выполнить запись, что особенно важно, если вы Вы меняете структуру дерева, как вращение, в то время как другой поток пытается выполнить чтение.
И последнее: я переписал код, чтобы сделать это из памяти, чтобы он не компилировался, но он должен быть закрыт:)