public void Fusionar(Nodo n1) { int totalLlaves = n1.Llaves.Count; int totalHijos = n1.Hijos.Count; totalLlaves += this.Llaves.Count; totalHijos += this.Hijos.Count; for (int x = 0; x < n1.Llaves.Count; x++) { Medicamento valor = n1.Llaves[x]; this.Push(valor); } for (int x = Hijos.Count - 1; x >= 0; x--) { Nodo e = n1.eliminarHijo(x); this.insertarNodo(e); } }
public void Eliminar(string k) { Nodo actual = Raiz; Nodo papa = null; while (actual != null) { if (actual.Llaves.Count == 1) { if (actual != Raiz) { string nombre = actual.Llaves[0].nombre; int posicionHijo = papa.posicionHijo(nombre); bool?caminoDerecho = null; Nodo hermano = null; if (posicionHijo > -1) { if (posicionHijo < 3) { hermano = papa.obtenerHijo(posicionHijo + 1); if (hermano.Llaves.Count > 1) { caminoDerecho = true; } } if (caminoDerecho == null) { if (posicionHijo > 0) { hermano = papa.obtenerHijo(posicionHijo - 1); if (hermano.Llaves.Count > 1) { caminoDerecho = false; } } } if (caminoDerecho != null) { Medicamento tmp; Medicamento tmp2; if (caminoDerecho.Value) { tmp = papa.Pop(posicionHijo); tmp2 = hermano.Pop(0); if (hermano.Hijos.Count > 0) { Nodo nod = hermano.eliminarHijo(0); actual.insertarNodo(nod); } } else { tmp = papa.Pop(posicionHijo); tmp2 = hermano.Pop(hermano.Llaves.Count - 1); if (hermano.Hijos.Count > 0) { Nodo nod = hermano.eliminarHijo(hermano.Hijos.Count - 1); actual.insertarNodo(nod); } } papa.Push(tmp2); actual.Push(tmp); } else { Medicamento tmp = null; if (papa.Hijos.Count >= 2) { if (posicionHijo == 0) { tmp = papa.Pop(0); } else if (posicionHijo == papa.Hijos.Count) { tmp = papa.Pop(papa.Llaves.Count - 1); } else//take papa's middle key { tmp = papa.Pop(1); } if (tmp != null) { actual.Push(tmp); Nodo sib = null; if (posicionHijo != papa.Hijos.Count) { sib = papa.eliminarHijo(posicionHijo + 1); } else { sib = papa.eliminarHijo(papa.Hijos.Count - 1); } actual.Fusionar(sib); } } else { actual.Fusionar(papa, hermano); Raiz = actual; papa = null; } } } } } { //Verificar si el nodo actual tiene el valor buscado int rmPos = -1; if ((rmPos = actual.tieneLlave(k)) >= 0) //Si se encontro una llave { //Si es una hoja, simplemente remover la llave if (actual.Hijos.Count == 0) { actual.Pop(rmPos); //Remover valor en la posicion encontrada } //Si no es hoja, reemplazar con la siguiente llave de mayor valor else { Nodo Siguiente = Min(actual.Hijos[rmPos]); if (Siguiente.Llaves.Count > 1) { Siguiente.Pop(0); } else { Siguiente.Padre.eliminarHijo(Siguiente); } } actual = null; } //Si no se encontro el valor buscado, seguir recorriendo arbol else { int p = actual.posicionHijo(k); papa = actual; actual = actual.obtenerHijo(p); } } } }