Fix implemantation of AVL Tree

online247
arbolavl.java

public class ArbolAVL<E extends Comparable<E>> { NodoAVL<E> root; public void insertar(E dato){ if(root==null){ this.root=new NodoAVL<E>(dato); return; } NodoAVL<E> parent=this.root; NodoAVL<E> current=parent; boolean setR = false; while(current!=null){ parent=current; setR=false; if(dato.compareTo(current.getDato())<0){ current=current.getL(); } else{ current=current.getR(); setR=true; } } if(setR){ parent.setR(new NodoAVL<E>(dato)); } else{ parent.setL(new NodoAVL<E>(dato)); } balancear(); } private void actualizarFE(){ actualizarFE(this.root); } private void actualizarFE(NodoAVL<E> nodo){ if(nodo==null){ return; } int R_H=actualizarH(nodo.getR()); int L_H=actualizarH(nodo.getL()); nodo.setFE(R_H-L_H); return; } private int actualizarH(NodoAVL<E> nodo){ if (nodo == null){ return 0; } int R_H=actualizarH(nodo.getR()); int L_H=actualizarH(nodo.getL()); int n_H= 1 + Math.max(R_H,L_H); nodo.setH(n_H); return n_H; } private void actualizarH(){ if(this.root!=null){ actualizarH(this.root); } } public NodoAVL<E> buscar(E dato){ NodoAVL<E> current=this.root; while(current.getDato()!=dato && current!=null){ if(dato.compareTo(current.getDato())<0){ current=current.getL(); } else{ current=current.getR(); } } if(current!=null){ return current; } return null; } private NodoAVL<E> rotarL(NodoAVL<E> nodo){ NodoAVL<E> a=new NodoAVL<E>(nodo.getDato()); a.setL(nodo.getL()); NodoAVL<E> b=nodo.getR(); b.setL(a); nodo=b; return nodo; } private NodoAVL<E> rotarR(NodoAVL<E> nodo){ NodoAVL<E> b=nodo.getL(); NodoAVL<E> a=b.getL(); b.setR(a); nodo=a; return nodo; } private NodoAVL<E> rotarDobleL(NodoAVL<E> nodo){ rotarR(nodo.getR()); rotarL(nodo); return nodo; } private NodoAVL<E> rotarDobleR(NodoAVL<E> nodo){ rotarL(nodo.getL()); rotarR(nodo); return nodo; } private NodoAVL<E> balancear(NodoAVL<E> nodo){ if(nodo==null){ return null; } balancear(nodo.getR()); balancear(nodo.getL()); if(nodo.getFE()==2){ if(nodo.getR()!=null&&nodo.getR().getFE()==-2){ nodo = rotarDobleL(nodo); } else{ nodo = rotarL(nodo); } } else if(nodo.getFE()==-2){ if(nodo.getL()!=null&&nodo.getL().getFE()==2){ nodo = rotarDobleR(nodo); } else{ nodo=rotarR(nodo); } } actualizarFE(nodo); return nodo; } private void balancear(){ actualizarH(); actualizarFE(); root=this.balancear(root); actualizarH(); actualizarFE(); } public static void main(String args[]){ ArbolAVL<Integer> arbol = new ArbolAVL <Integer>(); arbol.insertar(50); arbol.insertar(60); arbol.insertar(55); //arbol.insertar(90); //arbol.insertar(40); } }