Estoy tomando un curso de algoritmo en la universidad, y para uno de mis proyectos quiero implementar un árbol rojo-negro en C# (la implementación en sí no es el proyecto, sin embargo, algo decidí elige ayudarme).C# problema de referencia
Mi árbol rojo-negro debe contener claves de cadena, y el objeto que he creado para cada nodo tiene este aspecto:
class sRbTreeNode
{
public sRbTreeNode Parent = null;
public sRbTreeNode Right = null;
public sRbTreeNode Left = null;
public String Color;
public String Key;
public sRbTreeNode()
{
}
public sRbTreeNode(String key)
{
Key = key;
}
}
ya he añadido algunos métodos generales para imprimir el árbol, la búsqueda de la raíz, min/tecla máx (por alfabeto), etc ...
Tengo problemas para insertar nodos (por lo tanto, construir el árbol). Quien esté familiarizado con los árboles rojo-negro sabe que al agregar un nodo a un lado, podría haber cambiado el equilibrio del árbol. Para solucionar esto, debe "rotar" alrededor de los nodos en el árbol para equilibrar el árbol.
Escribí un método RightRotate y LeftRotate en pseudocódigo, y luego cuando traté de implementarlo en C#, me encontré con un montón de problemas de referencia con el objeto sRbTreeNode que creé.
Este es el pseudo-código que escribí para el método LeftRotate:
LeftRotate(root, node)
y <- node.Right;
node.Right <- y.Left;
if (y.Left != null)
y.Left.Parent <- node;
y.Parent <- node.Parent;
if (node.Parent = null)
root <- y;
else
if (node = node.Parent.Left)
node.Parent.Left = y;
else
node.Parent.Right = y;
y.Left <- node;
node.Parent <- y
he recibido una sugerencia para ponerlo en práctica en línea recta, pero sin utilizar la palabra clave 'ref', que he intentado en un principio. Esto es cómo lo hice:
public static void LeftRotate(sRbTreeNode root, sRbTreeNode node)
{
sRbTreeNode y = node.Right;
node.Right = y.Left;
if (y.Left != null)
y.Left.Parent = node;
y.Parent = node.Parent;
if (node.Parent == null)
root = y;
else
if (node == node.Parent.Left)
node.Parent.Left = y;
else
node.Parent.Right = y;
y.Left = node;
node.Parent = y;
}
Ahora, cuando puedo depurar, veo que funciona bien, pero los objetos que pase a este método sólo se rotan dentro del alcance del método. Cuando deja este método, parece que no hubo ningún cambio en los nodos reales. Es por eso que pensé en usar las palabras clave 'ref' en primer lugar.
¿Qué estoy haciendo mal?
Como dice Andras, muéstrenos el código hasta el momento y lo probaremos. –