|
Hola a todos nuevamente por aqui... Me he dado a la tarea de aprender python el cual me parece un excelente lenguaje de programacion, ademas el interprete en linea de comando es excelente y pues aqui dejo un problema que tenia y que lo resolvi con la ayuda de estas herramientas.. El problema: Debia construir un arbol de busqueda, pero con ciertas caracteristicas que no se apegan a los codigos que encontre en el internet ( solo hay codigos de arboles B, B+, Balanceados) lo cual no me servia, lo que necesitaba es un arbol al cual le pudiera ingresar nodos no importando la posicion, siempre y cuando tuvieran un padre, ademas el dato almacenado en los nodos no importa. Se podria tener un arbol con la siguiente descripcion por ejemplo: Fijandonos un poco en el valor de los nodos nos damos cuenta de que no esta ordenado, ni tampoco balanceado, se necesita que pueda ingresar cualquier valor en cualquier momento, siempre y cuando tenga padre y tambien espacio ya sea a la derecha o a la izquierda Asi que este es el resultado del codigo.... #==================================================================== # Arbol.py # Programa para la creacion de arboles que no forzozamente tienen # que estar balanceados, ademas que no forzozamente deben comenzar las # inserciones de nodos por la raiz # # Autor: Faustino Vasquez limon # #====================================================================
class Arbol: def __init__(self,valor): self.valor = valor self.izquierda = None self.derecha = None
#Metodo para agregar nodos a la izquierda del arbol, no importando que nodo #del arbol queremos como padre de este def AgregaIzquierda(self,padre,dato): if self.valor != padre: if self.izquierda != None: self.izquierda.AgregaIzquierda(padre,dato) if self.derecha!=None: self.derecha.AgregaIzquierda(padre,dato) else: self.izquierda=Arbol(dato) #Metodo para agregar nodos a la derecha, no importando que nodo del arbol #queremos como padre de este def AgregaDerecha(self,padre,dato): if self.valor != padre: if self.izquierda != None: self.izquierda.AgregaDerecha(padre,dato) if self.derecha!=None: self.derecha.AgregaDerecha(padre,dato) else: self.derecha = Arbol(dato) #Metodo que nos permite buscar un elemento en forma recursiva def BuscaNodo(self,dato): if self.valor != dato: if self.izquierda!=None: return self.izquierda.BuscaNodo(dato) if self.derecha!=None: return self.derecha.BuscaNodo(dato) else: return self.valor #Metodo para impresion del arbol comenzando Primero Izquierda usando recursividad def ImprimeArbolIzq(self): if self.valor!=None: print self.valor if self.izquierda!=None: self.izquierda.ImprimeArbolIzq() if self.derecha!=None: self.derecha.ImprimeArbolIzq()
#Metodo para impresion del arbol comenzando primero por la derecha usando recursividad def ImprimeArbolDer(self): if self.valor!=None: print self.valor if self.derecha!=None: self.derecha.ImprimeArbolDer() if self.izquierda!=None: self.izquierda.ImprimeArbolDer()
# .......................... 9 # ....................23......61 # ..............64..................81 # ..........7.......44..... 26 # ....................................55 # Crearemos la anterior estructura de en la forma primero izquierda y luego # derecha es decir que antes de crear un nodo derecho para la raiz tendremos que # crear un nodo derecho para el 64, de hecho se pude ingresar un nodo en cualquier # momento la unica condicion es que exista un padre para este nuevo nodo arbol= Arbol(9) # AgregaIzquierda(padre,dato)
arbol.AgregaIzquierda(9,23) arbol.AgregaIzquierda(23,64) arbol.AgregaIzquierda(64,7) arbol.AgregaDerecha(64,44) arbol.AgregaDerecha(9,61) arbol.AgregaDerecha(61,81) arbol.AgregaIzquierda(81,26) arbol.AgregaDerecha(26,55)
print print 'Impresion del arbol comenzando por la izquierda' arbol.ImprimeArbolIzq() print print print 'Impresion del arbol comenzando por la derecha' arbol.ImprimeArbolDer() print print print 'Buscando un valor' valor = arbol.BuscaNodo(7) print valor print
Esperando como siempre que esto le sirva a alguien Atte: Faustino Vasquez Limon Linux User
|