public void inorden(IteradorSimple<T> resultado) { if (izqNodo != null) { izqNodo.inorden(resultado); if (elemento != null) { try { resultado.agregar(elemento); } catch (IteradorException e) { } } NodoPA<T> aux = izqNodo.hermanoDerNodo; while (aux != null) { aux.inorden(resultado); aux = aux.hermanoDerNodo; } } else { if (elemento != null) { try { resultado.agregar(elemento); } catch (IteradorException e) { } } } }
public int darAltura() { int altura = (izqNodo == null) ? 1 : izqNodo.darAltura() + 1; int aux = (hermanoDerNodo == null) ? 0 : hermanoDerNodo.darAltura(); if (aux > altura) { altura = aux; } return altura; }
private void darElementosPA(Lista<T> lista) { if (elemento != null) { lista.agregar(elemento); } if (izqNodo != null) { izqNodo.darElementosPA(lista); NodoPA<T> nodo = izqNodo.hermanoDerNodo; while (nodo != null) { nodo.darElementosPA(lista); nodo = nodo.hermanoDerNodo; } } }
public Lista<T> buscarPorPrefijo(String prefijo) { Lista<T> lista = new Lista<T>(); raiz.buscarPorPrefijo(prefijo, lista); return lista; }
public T eliminar(String palabra) { T elemento = buscar(palabra); int eliminados = elemento != null ? raiz.eliminar(palabra) : 0; peso -= eliminados; return elemento; }
public int eliminar(String palabra) { int eliminados = 0; char c = palabra.charAt(0); // Primer carácter de la palabra if (izqNodo != null && izqNodo.caracter == c) // Sólo se continúa la eliminación si el primer carácter de la palabra es igual // al del nodo actual { if (palabra.length() > 1) { eliminados += izqNodo.eliminar(palabra.substring(1)); if (izqNodo.izqNodo == null && eliminados > 0 && izqNodo.elemento == null) { izqNodo = izqNodo.hermanoDerNodo; eliminados++; } } else { if (izqNodo.elemento != null) { izqNodo.elemento = null; if (izqNodo.izqNodo == null) { izqNodo = izqNodo.hermanoDerNodo; eliminados++; } } } } else if (izqNodo != null && izqNodo.caracter < c && izqNodo.hermanoDerNodo != null) // Buscar si la palabra existe en otro nodo a la derecha y eliminarla { // Buscar el nodo en el que se debe realizar la eliminación NodoPA<T> hermanoIzquierdo = izqNodo; NodoPA<T> nodo = izqNodo.hermanoDerNodo; while (nodo != null && nodo.caracter != c) { hermanoIzquierdo = nodo; nodo = nodo.hermanoDerNodo; } if (nodo != null && palabra.length() > 1) { eliminados = nodo.eliminar(palabra.substring(1)); if (nodo.izqNodo == null && eliminados > 0 && nodo.elemento == null) { hermanoIzquierdo.hermanoDerNodo = nodo.hermanoDerNodo; eliminados++; } } else if (nodo != null && nodo.elemento != null) { nodo.elemento = null; if (nodo.izqNodo == null) { hermanoIzquierdo.hermanoDerNodo = nodo.hermanoDerNodo; eliminados++; } } } return eliminados; }
public void buscarPorPrefijo(String prefijo, Lista<T> lista) { NodoPA<T> aux = this.izqNodo; // Se ubica el nodo a partir del cual se deben recolectar los elementos while (aux != null && prefijo.length() != 0) { char nCaracter = prefijo.charAt(0); if (aux.caracter == nCaracter) { prefijo = prefijo.substring(1); if (prefijo.length() != 0) { aux = aux.izqNodo; } } else if (aux.hermanoDerNodo != null) { while (aux != null && aux.caracter != nCaracter) { aux = aux.hermanoDerNodo; } } else aux = null; } if (aux != null) { aux.darElementosPA(lista); } }
public int darAltura() { return (raiz != null) ? raiz.darAltura() : 0; }
public IteradorSimple<T> inorden() { IteradorSimple<T> resultado = new IteradorSimple<T>(peso); raiz.inorden(resultado); return resultado; }
public T buscar(String palabra) { return raiz.buscar(palabra); }
public void insertar(T elemento) { String palabra = elemento.toString(); peso += raiz.insertar(palabra, elemento); }
public int insertar(String palabra, T elem) { // Si la palabra solo tiene 1 carácter y el elemento del hijo izquierdo es igual al elemento a // insertar, entonces la palabra es repetida if (palabra.length() == 1 && izqNodo != null && izqNodo.elemento != null && izqNodo.elemento.equals(elem)) {} int elementosInsertados = 0; char nCaracter = palabra.charAt(0); if (izqNodo != null && izqNodo.caracter == nCaracter) // Si el carácter del hijo izquierdo es igual al que se quiere insertar { if (palabra.length() != 1) return izqNodo.insertar( palabra.substring(1), elem); // El hijo izquierdo es responsable de insertar el nuevo elemento else izqNodo.elemento = elem; // Se agregó un prefijo de una palabra existente } else if (izqNodo != null && izqNodo.caracter > nCaracter) { NodoPA<T> nuevoNodo = null; if (palabra.length() == 1) { nuevoNodo = new NodoPA<T>(nCaracter, elem); } else { nuevoNodo = new NodoPA<T>(nCaracter); // Nodo solo con el caracter elementosInsertados += nuevoNodo.insertar(palabra.substring(1), elem); } // El carácter a insertar debería ser el nuevo hijo izquierdo del nodo actual NodoPA<T> temp = izqNodo; izqNodo = nuevoNodo; izqNodo.hermanoDerNodo = temp; elementosInsertados++; } else if (izqNodo != null && izqNodo.hermanoDerNodo != null) // Se debe agregar el nodo sobre los hermanos del nodo actual { // Se mantiene el anterior por si se deben correr los nodos hermanos NodoPA<T> iterador = izqNodo.hermanoDerNodo; NodoPA<T> anterior = izqNodo; // Ubicar el lugar donde deba ir el nuevo hermano while (iterador != null && iterador.caracter < nCaracter) { anterior = iterador; iterador = iterador.hermanoDerNodo; } if (iterador != null && iterador.caracter == nCaracter) // Encontró el nodo que deba agregar el resto de la palabra { if (palabra.length() == 1) { // En caso que la palabra termine y solo deba agregar el elemento a ese nodo iterador.elemento = elem; elementosInsertados++; } else elementosInsertados += iterador.insertar(palabra.substring(1), elem); } else { NodoPA<T> nuevoNodo = null; if (palabra.length() == 1) { nuevoNodo = new NodoPA<T>(nCaracter, elem); } else { nuevoNodo = new NodoPA<T>(nCaracter); // Nodo solo con el caracter elementosInsertados += nuevoNodo.insertar(palabra.substring(1), elem); } // Se debe insertar un nuevo nodo entre dos hermanos // Debe crear un nuevo nodo y colocarlo anterior.hermanoDerNodo = nuevoNodo; // El nuevo hermanoDerecho del anterior es el nuevo nodo nuevoNodo.hermanoDerNodo = iterador; // El hermanoDerecho del nuevo nodo es el nodo que se tenia en iterador elementosInsertados++; } } else if (izqNodo != null && izqNodo.hermanoDerNodo == null) // No existe un hermano del nodo izquierdo { NodoPA<T> nuevoNodo = null; if (palabra.length() == 1) { nuevoNodo = new NodoPA<T>(nCaracter, elem); } else { nuevoNodo = new NodoPA<T>(nCaracter); // Nodo solo con el caracter elementosInsertados += nuevoNodo.insertar(palabra.substring(1), elem); } izqNodo.hermanoDerNodo = nuevoNodo; elementosInsertados++; } else { NodoPA<T> nuevoNodo = null; if (palabra.length() == 1) { nuevoNodo = new NodoPA<T>(nCaracter, elem); } else { nuevoNodo = new NodoPA<T>(nCaracter); // Nodo solo con el caracter elementosInsertados += nuevoNodo.insertar(palabra.substring(1), elem); } // Se agrega un nodo como el hijo izquierdo del nodo actual izqNodo = nuevoNodo; elementosInsertados++; } return elementosInsertados; }