public void InsercionArbol(Arbol arbol, int Clave, long Direccion, string Ruta, Atributo atributo, string RutaArchDicc) { if (arbol.Nodos.Count == 0) // En caso de que no haya ningún nodo en el árbol(Ni siquiera una hoja) { //MessageBox.Show("No hay ningún nodo en el archivo"); Nodo NuevaHoja = CreaNodo('H', ManejadorArchivo.ObtenUltimaDireccion(Ruta, archivo)); NuevaHoja.Llaves[0] = Clave; // Agregamos la clave NuevaHoja.DireccionLlaves[0] = Direccion; // Agregamos la dirección ManejadorArchivo.EscribeNodo(NuevaHoja, archivo, Ruta); // Escribimos el nodo en el archivo de indice atributo.Direccion_Indice = NuevaHoja.DirNodo; // Modificamos el atributo para que apunte al unico nodo ManejadorArchivo.ModificaAtributo(atributo, RutaArchDicc, archivo); // Escribimos el atributo en el archivo } else if (!arbol.TieneRaiz()) // En caso de que no tenga Raiz(Solamente una hoja) { Nodo Hoja = arbol.Nodos[0]; // Como ya leímos el archivo de indices anteriormente ya sabemos que solo hay un nodo en la lista de Nodos del arbol List <Nodo> nodos = InsertaEnHoja(Hoja, Ruta, Clave, Direccion); //Llamamos al método que inserta la clave y la dirección en una hoja if (nodos.Count == 2) // Como InsertaEnHoja regresa una lista si solo regresa un nodo no se dividió el nodo, si son 2 ocurrió una división { //MessageBox.Show("Dividí la hoja unica al momento de la inserción, creando nodo Raiz"); Nodo NuevaRaiz = CreaNodo('R', ManejadorArchivo.ObtenUltimaDireccion(Ruta, archivo)); // Creamos el nodo Raiz que va a apuntar a las 2 hojhas NuevaRaiz.DireccionLlaves[0] = nodos[0].DirNodo; // La primera direccion de la raiz va a apuntar a la hoja de la izquierda NuevaRaiz.DireccionLlaves[1] = nodos[1].DirNodo; // La segunda direccion de la raiz va a apuntar a la hoja de la derecha NuevaRaiz.Llaves[0] = nodos[1].Llaves[0]; // Se agrega la llave que se sube a la Raiz a la raiz atributo.Direccion_Indice = NuevaRaiz.DirNodo; // Modificamos la dirección a la que va a apuntar el Ap del indice del atributo ManejadorArchivo.EscribeNodo(NuevaRaiz, archivo, Ruta); // Se escribe el nodo raiz ManejadorArchivo.ModificaAtributo(atributo, RutaArchDicc, archivo); // Se escribe el atributo modificado en el Diccionario de Datos } } else // Ya existe una raíz ( Y puede que existan intermedios también) { //MessageBox.Show("YA EXISTE RAIZ!"); Nodo Padre = new Nodo(); // Creamos un nodo que va a figurar como el padre Nodo Hijo = arbol.ObtenRaiz();; // Obtenemos la raiz y por el momento se lo asignamos al nodo Hijo do { Padre = Hijo; // Lo inicializamos así para que podamos obtener el Padre dependiendo del valor en eñ qie se quedó el hijo int i = Padre.ObtenIndiceClave(Clave); Hijo = arbol.GetNodo(Padre.DireccionLlaves[i]); } while (Hijo.TipoNodo != 'H'); List <Nodo> Res = InsertaEnHoja(Hijo, Ruta, Clave, Direccion); if (Res.Count == 2) // En caso de que la hoja se dividió (Es necesario subir una clave al nodo Padre en cuestión) { ActualizaNodoPadre(Padre, Res[1].Llaves[0], Res[1].DirNodo, arbol, Ruta, RutaArchDicc, atributo); // Actualizamos los valores del nodo padre con la dir de la nueva hoja y su llave } } }
public void InsercionArbol(Arbol arbol, int Clave, long Direccion, string Ruta, Atributo atributo, string RutaArchDicc) { if (arbol.Nodos.Count == 0) { Nodo NuevaHoja = CreaNodo('H', ManejadorArchivo.ObtenUltimaDireccion(Ruta, archivo)); NuevaHoja.Llaves[0] = Clave; NuevaHoja.DireccionLlaves[0] = Direccion; ManejadorArchivo.EscribeNodo(NuevaHoja, archivo, Ruta); atributo.Direccion_Indice = NuevaHoja.DirNodo; ManejadorArchivo.ModificaAtributo(atributo, RutaArchDicc, archivo); } else if (!arbol.TieneRaiz()) // En caso de que no tenga Raiz(Solamente una hoja) { Nodo Hoja = arbol.Nodos[0]; List <Nodo> nodos = InsertaEnHoja(Hoja, Ruta, Clave, Direccion); if (nodos.Count == 2) { Nodo NuevaRaiz = CreaNodo('R', ManejadorArchivo.ObtenUltimaDireccion(Ruta, archivo)); NuevaRaiz.DireccionLlaves[0] = nodos[0].DirNodo; NuevaRaiz.DireccionLlaves[1] = nodos[1].DirNodo; NuevaRaiz.Llaves[0] = nodos[1].Llaves[0]; atributo.Direccion_Indice = NuevaRaiz.DirNodo; ManejadorArchivo.EscribeNodo(NuevaRaiz, archivo, Ruta); ManejadorArchivo.ModificaAtributo(atributo, RutaArchDicc, archivo); } } else { Nodo Padre; Nodo Hijo = arbol.ObtenRaiz(); do { Padre = Hijo; int i = Padre.ObtenIndiceClave(Clave); Hijo = arbol.GetNodo(Padre.DireccionLlaves[i]); } while (Hijo.TipoNodo != 'H'); List <Nodo> Res = InsertaEnHoja(Hijo, Ruta, Clave, Direccion); if (Res.Count == 2) { ActualizaNodoPadre(Padre, Res[1].Llaves[0], Res[1].DirNodo, arbol, Ruta, RutaArchDicc, atributo); } } }