public nodoavl giroizq(nodoavl nodo) { //cambiar apuntadores nodoavl tempder = nodo.der; tempder.raiz = nodo.raiz; nodo.raiz = tempder; nodo.der = tempder.izq; tempder.izq = nodo; if (nodo.der != null) { nodo.der.raiz = nodo; } if (tempder.raiz != null) { if (tempder.raiz.der == nodo) { tempder.raiz.der = tempder; } else { tempder.raiz.izq = tempder; } } else { raiz = tempder; //si el padre es nulo, la nueva raiz es el nodo rotado } return(tempder); }
} //constructor sin parametros para el webservice public nodoavl(usuario user_) { user = user_; nick = user_.getnick(); pass = user_.getpass(); email = user_.email; raiz = null; izq = null; der = null; }
public void insertar(usuario nuevouser, nodoavl nodo) { if (nodo == null) { if (raiz == null) { raiz = new nodoavl(nuevouser);//crear nueva raiz cont++; } else { insertar(nuevouser, raiz); //insertar a partir de la raiz } } else { //el nodo va a la rama izquierda if (String.Compare(nodo.nick, nuevouser.getnick()) > 0) { if (nodo.izq == null) { nodo.izq = new nodoavl(nuevouser); nodo.izq.raiz = nodo; rotacion(nodo.izq);//realizar balanceo cont++; } else { insertar(nuevouser, nodo.izq); } } //el nodo va a la rama derecha else if (String.Compare(nodo.nick, nuevouser.getnick()) < 0) { if (nodo.der == null) { nodo.der = new nodoavl(nuevouser); nodo.der.raiz = nodo; rotacion(nodo.der);//realizar balanceo cont++; } else { insertar(nuevouser, nodo.der); } } } }
public String graficar(avl arbol) { String dotgraph = "Digraph contactos {\nRankdir=TD\nnode [shape =circle]\n"; if (arbol != null) { nodoavl temp = arbol.raiz; if (temp != null) { dotgraph += agregarnodos(temp); } } dotgraph += "}"; //finalizar grafo return(guardar(dotgraph)); //retornar la dirección de la imagen }
public String agregarnodos(nodoavl user) { String salida = ""; if (user != null) { salida += user.nick + " [label=\"Usuario: " + user.nick + "\nContraseña: " + user.pass + "\nemail: " + user.email + "\"];\n"; if (user.izq != null) { salida += agregarnodos(user.izq); salida += user.nick + " -> " + user.izq.nick + ";\n"; } if (user.der != null) { salida += agregarnodos(user.der); salida += user.nick + " -> " + user.der.nick + ";\n"; } } return(salida); }
public avl() { raiz = null; cont = 0; }
public void rotacion(nodoavl nodo) { int balance = nodo.fe(); //obtener factor de equilibrio if (balance > 1) //el factor de equilibrio es 2 o más, el peso es por la derecha { if (nodo.der != null) { if (nodo.der.fe() >= 0) { nodoavl rotado = giroizq(nodo);//realizar rotación izquierda if (rotado.raiz != null) { rotacion(rotado.raiz); //continuar con la rotación hacia la raíz } } else if (nodo.der.fe() < 0) //realizar rotación doble por la derecha y luego por la izquierda { giroder(nodo.der); //realizar rotación derecha con el nodo derecho nodoavl rotado = giroizq(nodo); //realizar rotación izquierda con el nodo if (rotado.raiz != null) { rotacion(rotado.raiz); //continuar con la rotación hacia la raíz } } } //else no se hace rotación porque el nodo esá balanceado } else if (balance < -1)//el factor de equilibrio es -2 o menos, el peso es por la izquierda { if (nodo.izq != null) { if (nodo.izq.fe() <= 0) { nodoavl rotado = giroder(nodo);//realizar rotación derecha if (rotado.raiz != null) { rotacion(rotado.raiz); //continuar con la rotación hacia la raíz } } else if (nodo.izq.fe() > 0) //realizar rotación doble por la izquierda y luego por la derecha { giroizq(nodo.izq); //realizar rotación izquierda con el nodo izquierdo nodoavl rotado = giroder(nodo); //realizar rotación derecha con el nodo if (rotado.raiz != null) { rotacion(rotado.raiz); //continuar con la rotación hacia la raíz } } } //else no se hace rotación porque el nodo esá balanceado } else { if (nodo.raiz != null) { rotacion(nodo.raiz); //continuar con la rotacion hacia la raiz } } }