/**\brief Particiona un nodo del Arbol B+*/ public CNodo particiona(CNodo hoja, CBloque b, long posB, ref Object clave, ref long dirClave, int i) { CNodo nuevo = new CNodo(hoja.getTipoNodo(), GRADO); int k, j; Object claveAux = null; long dirAux = -1; if (hoja.getTipoNodo() == RAIZHOJA) { hoja.setTipoNodo(HOJA); nuevo.setTipoNodo(HOJA); } else if (hoja.getTipoNodo() == RAIZ) { hoja.setTipoNodo(PAGINA); nuevo.setTipoNodo(PAGINA); } nuevo.setTipoClave(b.getTipoCA()); j = (2 * GRADO) - 1; if (i >= GRADO) { if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA) { if (i == GRADO) { k = GRADO - 1; hoja.setNumElemnt(GRADO); claveAux = clave; dirAux = dirClave; } else { k = GRADO - 2; hoja.setNumElemnt(GRADO); claveAux = hoja.getAtClave(GRADO); dirAux = hoja.getAtDirClaves(GRADO); } } else { k = GRADO - 1; hoja.setNumElemnt(GRADO); } } else { if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA) { claveAux = hoja.getAtClave(GRADO - 1); dirAux = hoja.getAtDirClaves(GRADO - 1); k = GRADO - 1; } else k = GRADO; hoja.setNumElemnt(GRADO - 1); } nuevo.setNumElemnt(k + 1); for (; k >= 0; k--, j--) { nuevo.setAtClave(k, hoja.getAtClave(j)); nuevo.setAtDirClaves(k, hoja.getAtDirClaves(j)); if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA) nuevo.setAtDirNodo(k + 1, hoja.getAtDirNodo(j + 1)); else nuevo.setAtDirNodo(k, hoja.getAtDirNodo(j)); } if (i >= GRADO) { if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA) { if (i != GRADO) { nuevo.setAtDirNodo(0, hoja.getAtDirNodo(GRADO + 1)); nuevo.insClaveOrd(clave, b, getArchivo(), (i - GRADO) - 1); nuevo.setAtDirClaves((i - GRADO) - 1, dirClave); nuevo.setAtDirNodo(i - GRADO, posB); }else nuevo.setAtDirNodo(0, posB); } else nuevo.insClaveOrd(clave, b, getArchivo(), i - GRADO); } else { hoja.insClaveOrd(clave, b, getArchivo(), i); if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA) { nuevo.setAtDirNodo(0, hoja.getAtDirNodo(GRADO)); hoja.setAtDirClaves(i, dirClave); hoja.setAtDirNodo(i + 1, posB); } } if (hoja.getTipoNodo() == RAIZ || hoja.getTipoNodo() == PAGINA) { clave = claveAux; dirClave = dirAux; }else { clave = nuevo.getAtClave(0); dirClave = nuevo.getAtDirClaves(0); } getArchivo().escribeNodo(hoja); nuevo.setDir(getArchivo().ENDF()); getArchivo().escribeNodo(nuevo); return (nuevo); }
/**Escribe un objeto CNodo utilizado en Arbol B+*/ public void escribeNodo(CNodo nuevo) { bw.BaseStream.Seek(nuevo.getDir(), SeekOrigin.Begin); bw.Write(nuevo.getDir()); bw.Write(nuevo.getTipoNodo()); bw.Write(nuevo.getNumElemnt()); bw.Write(nuevo.getGrado()); bw.Write(nuevo.getTipoClave()); //Escribir la dir de las paginas u hojas for (int i = 0; i < (nuevo.getGrado() * 2) + 1; i++) bw.Write(nuevo.getAtDirNodo(i)); //Escribir la dir de las llaves de las paginas del arbol for (int i = 0; i < nuevo.getGrado() * 2; i++) bw.Write(nuevo.getAtDirClaves(i)); }
private CNodo creaNodo(CArchivo aO, CArchivo aN, CNodo nodoAux) { CNodo nuevo; nuevo = new CNodo(nodoAux.getTipoNodo(), nodoAux.getGrado()); nuevo.setNumElemnt(nodoAux.getNumElemnt()); nuevo.setTipoClave(nodoAux.getTipoClave()); for(int i = 0; i< nodoAux.getNumElemnt(); i++) { nuevo.setAtDirClaves(i, aN.ENDF()); nuevo.escribeClave(nodoAux.getAtClave(i), aN.ENDF(), nodoAux.getTipoClave(), aN); } nuevo.setDir(aN.ENDF()); aN.escribeNodo(nuevo); return (nuevo); }