private void Balancear(Nodo <T> node, bool isnew, bool isleft) { var timer = new LogFile(); var exit = false; while ((node != null) && !exit) { var didRotate = false; if (isnew) { if (isleft) { node.Factor--; } else { node.Factor++; } } else { if (node.Factor == 0) { exit = true; } timer.Logcreate("Balanceo"); if (isleft) { node.Factor++; } else { node.Factor--; } } if (node.Factor == 0) { exit = true; timer.Logcreate("Balanceo"); } else if (node.Factor == -2) { if (node.Izquierdo.Factor == 1) { RotacionDDerecha(node); didRotate = true; } else { RotaciónDerecha(node); didRotate = true; } exit = true; timer.Logcreate("Balanceo"); } else if (node.Factor == 2) { if (node.Derecho.Factor == -1) { RotacionDIzquierda(node); didRotate = true; } else { RotaciónIzquierda(node); didRotate = true; } exit = true; timer.Logcreate("Balanceo"); } if ((didRotate) && (node.Padre != null) && (!isnew)) { node = node.Padre; } if (node.Padre != null) { if (node.Padre.Derecho == node) { isleft = false; } else { isleft = true; } if ((!isnew) && (node.Factor == 0)) { exit = false; } } node = node.Padre; } }
public Nodo <T> Eliminar(T value) { var timer = new LogFile(); var auxiliar = root; var padre = null as Nodo <T>; var esHijoIz = true; while (Comparador(auxiliar.value, value) != 0) { padre = auxiliar; if (Comparador(value, auxiliar.value) < 0) { esHijoIz = true; auxiliar = auxiliar.Izquierdo; } else { esHijoIz = false; auxiliar = auxiliar.Derecho; } if (auxiliar == null) { return(null); } }// Fin ciclo inicial if (auxiliar.Izquierdo == null && auxiliar.Derecho == null) // nodo hoja { if (padre != null) { if (esHijoIz) { padre.Izquierdo = null; timer.Logcreate("Eliminación"); } else { padre.Derecho = null; timer.Logcreate("Eliminación"); } Balancear(padre, false, esHijoIz); } else { root = null; timer.Logcreate("Eliminación"); } } else if (auxiliar.Derecho == null) // solo hijo Izquierdo { if (padre != null) { if (esHijoIz) { padre.Izquierdo = auxiliar.Izquierdo; auxiliar.Izquierdo.Padre = padre; timer.Logcreate("Eliminación"); } else { padre.Derecho = auxiliar.Izquierdo; auxiliar.Izquierdo.Padre = padre; timer.Logcreate("Eliminación"); } Balancear(padre, false, esHijoIz); } else { auxiliar.Izquierdo.Padre = null; root = auxiliar.Izquierdo; timer.Logcreate("Eliminación"); } } else if (auxiliar.Izquierdo == null) //solo hijo Derecho { if (padre != null) { if (esHijoIz) { padre.Izquierdo = auxiliar.Derecho; auxiliar.Derecho.Padre = padre; timer.Logcreate("Eliminación"); } else { padre.Derecho = auxiliar.Derecho; auxiliar.Derecho.Padre = padre; timer.Logcreate("Eliminación"); } Balancear(padre, false, esHijoIz); } else { auxiliar.Derecho.Padre = null; root = auxiliar.Derecho; timer.Logcreate("Eliminación"); } } else // Tiene dos hijos { var reemplazo = Reemplazar(auxiliar); if (root == auxiliar) { root = reemplazo; root.Padre = null; timer.Logcreate("Eliminación"); Balancear(root, false, esHijoIz); } else if (esHijoIz) { padre.Izquierdo = reemplazo; padre.Izquierdo.Padre = padre; timer.Logcreate("Eliminación"); Balancear(padre, false, esHijoIz); } else { padre.Derecho = reemplazo; timer.Logcreate("Eliminación"); Balancear(padre, false, esHijoIz); } reemplazo.Izquierdo = auxiliar.Izquierdo; timer.Logcreate("Eliminación"); } return(auxiliar); }
protected void RotacionDIzquierda(Nodo <T> nodo) { var timer = new LogFile(); var RParent = nodo.Padre; var P = nodo; var Q = nodo.Derecho; var R = Q.Izquierdo; var B = R.Izquierdo; var C = R.Derecho; if (RParent != null) { if (RParent.Derecho == P) { RParent.Derecho = R; } else { RParent.Izquierdo = R; } } P.Derecho = B; Q.Izquierdo = C; R.Izquierdo = P; R.Derecho = Q; R.Padre = RParent; P.Padre = Q.Padre = R; if (B != null) { B.Padre = P; } if (C != null) { C.Padre = Q; } switch (R.Factor) { case -1: { P.Factor = 0; Q.Factor = 1; } break; case 0: { P.Factor = 0; Q.Factor = 0; } break; case 1: { P.Factor = -1; Q.Factor = 0; } break; } timer.Logcreate("Rotación Doble a la Izquierda"); }
protected void RotacionDDerecha(Nodo <T> nodo) { var timer = new LogFile(); var RootParent = nodo.Padre; var P = nodo as Nodo <T>; var Q = P.Izquierdo; var R = Q.Derecho; var B = R.Izquierdo; var C = R.Derecho; if (RootParent != null) { if (RootParent.Derecho == P) { RootParent.Derecho = R; } else { RootParent.Izquierdo = R; } } else { root = R; root.Padre = null; } Q.Derecho = B; P.Izquierdo = C; R.Izquierdo = Q; R.Derecho = P; R.Padre = RootParent; P.Padre = Q.Padre = R; if (B != null) { B.Padre = Q; } if (C != null) { C.Padre = P; } switch (R.Factor) { case -1: { Q.Factor = 0; P.Factor = 1; } break; case 0: { Q.Factor = 0; P.Factor = 0; } break; case 1: { Q.Factor = -1; P.Factor = 0; } break; } R.Factor = 0; timer.Logcreate("Rotación Doble a la derecha"); }
public AVL(CompareTo <T> compare) { root = null; this.Comparador = compare; }
public AVL() { root = null; }