def __cantidadDeNodo(self, nodoActual): if Nodo.esNodoVacio(nodoActual): return 0 cantidadPorIzquierda = self.__cantidadDeNodo( nodoActual.getHijoIzquierdo()) cantidadPorDerecha = self.__cantidadDeNodo(nodoActual.getHijoDerecho()) return cantidadPorIzquierda + cantidadPorDerecha + 1
def __alturaRec(self, nodoActual): if Nodo.esNodoVacio(nodoActual): return 0 alturaPorIzquierda = self.__alturaRec(nodoActual.getHijoIzquierdo()) alturaPorDerecha = self.__alturaRec(nodoActual.getHijoDerecho()) if alturaPorDerecha > alturaPorIzquierda: return alturaPorDerecha + 1 return alturaPorIzquierda + 1
def postOrdenR(self, nodoActual, recorrido): if Nodo.esNodoVacio(nodoActual): return nodoHijoPorIzquierda = nodoActual.getHijoIzquierdo() self.postOrdenR(nodoHijoPorIzquierda, recorrido) nodoHijoPorDeracha = nodoActual.getHijoDerecho() self.postOrdenR(nodoHijoPorDeracha, recorrido) recorrido.append(nodoActual.getDato())
def buscar(self, dato): nodoAuxiliar = self.raiz while not Nodo.esNodoVacio(nodoAuxiliar): if dato == nodoAuxiliar.getDato(): return nodoAuxiliar.getDato() if dato < nodoAuxiliar.getDato(): nodoAuxiliar = nodoAuxiliar.getHijoIzquierdo() else: nodoAuxiliar = nodoAuxiliar.getHijoDerecho() return None
def hermanoDeUnNodo(self, dato): if self.esArbolVacio() or self.cantidadDeNodo() == 1 or self.raiz.getDato() == dato: raise ValueError nodoActual = self.raiz nodoPadre = Nodo.nodoVacio() while dato != nodoActual.getDato() and not Nodo.esNodoVacio(nodoActual): nodoPadre = nodoActual if dato < nodoActual.getDato(): nodoActual = nodoActual.getHijoIzquierdo() else: nodoActual = nodoActual.getHijoDerecho() if dato == nodoActual.getDato(): if nodoPadre.getHijoIzquierdo().getDato() == dato: return nodoPadre.getHijoDerecho() else: return nodoPadre.getHijoIzquierdo() else: raise ValueError
def insertar(self, dato): if self.esArbolVacio(): self.raiz = Nodo(dato) nodoActual = self.raiz nodoAnterior = Nodo.nodoVacio() # buscar la posicion del nuevoNodo while not Nodo.esNodoVacio(nodoActual): if dato == nodoActual.getDato(): return False nodoAnterior = nodoActual if dato < nodoActual.getDato(): nodoActual = nodoActual.getHijoIzquierdo() else: nodoActual = nodoActual.getHijoDerecho() # fin del ciclo # se inserte el nuevoNodo en su posicion nuevoNodo = Nodo(dato) if dato < nodoAnterior.getDato(): nodoAnterior.setHijoIzquierdo(nuevoNodo) else: nodoAnterior.setHijoDerecho(nuevoNodo) # ------------------------------------------ return True
def esArbolVacio(self): return Nodo.esNodoVacio(self.raiz)
def buscarDatoSucesor(self, nodoActual): nodoAnterior = nodoActual while not Nodo.esNodoVacio(nodoActual): nodoAnterior = nodoActual nodoActual = nodoActual.getHijoIzquierdo() return nodoAnterior.getDato()