Ejemplo n.º 1
0
 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
         }
     }
 }
Ejemplo n.º 2
0
        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);
                }
            }
        }