Casualmente, acabo de implementar un btree en C#, para un proyecto personal. Fue divertido. Construí un btree de teclas de tamaño variable ordenadas lexicográficamente (hasta 64 bytes) que presentaban una serie de desafíos, particularmente en torno a averiguar cuándo una página de almacenamiento estaba demasiado llena o demasiado vacía.
Mi consejo, habiendo hecho eso, es la construcción de una capa de abstracción que capta sólo los algoritmos btree en su forma más abstracta, como una clase base abstracta. Una vez que obtuve todas las reglas de btree capturadas en esa forma, especialicé la clase base de varias maneras diferentes: como un btree regular de tamaño de clave fija de 2-3, como uno de mis btrees de fantasía de clave de tamaño variable, y así sucesivamente. .
Para empezar, en ningún caso debe usted hacer esto con punteros. El código inseguro rara vez es necesario y nunca es fácil. Solo los programadores C# más avanzados deben desconectar el sistema de seguridad; cuando lo hace, se responsabiliza por el tipo y la seguridad de la memoria del programa. Si no está dispuesto a hacerlo, deje el sistema de seguridad encendido.
En segundo lugar, no hay ninguna razón para hacer de esto una estructura. Las estructuras se copian por valor en C#; un nodo btree no es un valor .
En tercer lugar, no es necesario para mantener el número de llaves en un nodo; la matriz de teclas sabe cuántas teclas contiene.
En cuarto lugar, me gustaría utilizar un List<T>
en lugar de una matriz; ellos son mas flexibles
En quinto lugar, tiene que decidir si las vidas clave en el nodoo en la matriz . De cualquier manera puede funcionar; Mi preferencia es la clave para vivir en el nodo, porque veo que la clave está asociada con el nodo.
En sexto lugar, es útil saber si un nodo bt es la raíz o no; podrías considerar tener dos bools, uno "¿esta es una hoja?" y uno "¿es esta la raíz?" Por supuesto, un btree con un solo elemento en él tiene un único nodo que es tanto de hoja como de raíz.
Séptimo, probablemente va a construir esto para que sea mutable; normalmente uno no hace públicos campos mutables en una clase C#. Puede considerar hacerles propiedades. Además, la lista de los niños puede ser cultiva y encogido, pero su identidad no cambia, por lo que sea referencialmente de sólo lectura:
así que probablemente estructurar mi nodo básico como:
class Node
{
public int Key { get; set; }
public bool IsRoot { get; set; }
public bool IsLeaf { get; set; }
private List<Node> children = new List<Node>();
public List<Node> Children { get { return this.children; } }
}
¿Tiene sentido?
¿Por qué quieres usar una estructura en lugar de una clase? – CodesInChaos
, por supuesto, puede usar C# para árboles B – Adrian
No intente usar código inseguro en C# hasta que sea un experto; lo entenderás mal y será doloroso y difícil. Por el contrario, aprenda la forma segura de hacer las cosas primero; C# está diseñado para que la forma segura de hacer las cosas sea casi siempre más fácil que la manera insegura. –