Creacion de un Arbol de Busqueda en Python

0
890
arbol
Arbol

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:

arbol

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

 

 

LEAVE A REPLY

Please enter your comment!
Please enter your name here