Uploaded by DERIAN EDUANI FUENTES BATZ

Arboles de Busquedad

advertisement
Arboles de Busquedad
Un árbol binario de búsqueda (abb) se basa en la propiedad de que las claves que son
menores que el padre se encuentran en el subárbol izquierdo, y las claves que son mayores
que el padre se encuentran en el subárbol derecho. Llamaremos esto la propiedad abb. A
medida que implementemos la interfaz de Vector Asociativo como se describió anteriormente,
la propiedad abb guiará nuestra implementación. La Figura 1 ilustra esta propiedad de un
árbol binario de búsqueda, mostrando las claves sin ningún valor asociado. Observe que la
propiedad es válida para cada padre e hijo. Todas las claves del subárbol izquierdo son
menores que la clave de la raíz. Todas las claves en el subárbol derecho son mayores que la
raíz.
Programa 1
class ArbolBinarioBusqueda:
def __init__(self):
self.raiz = None
self.tamano = 0
def longitud(self):
return self.tamano
def __len__(self):
return self.tamano
def __iter__(self):
return self.raiz.__iter__()
La clase NodoArbol proporciona muchas funciones auxiliares que hacen que el trabajo
realizado en los métodos de la clase ArbolBinarioBusqueda sea mucho más fácil. El
constructor de un NodoArbol, junto con estas funciones auxiliares, se muestra en el Programa
2. Como se puede ver en el programa, muchas de estas funciones auxiliares ayudan a
clasificar un nodo según su propia posición como hijo, (izquierdo o derecho) y el tipo de hijos
que tiene el nodo. La clase NodoArbol también mantendrá explícitamente un seguimiento del
padre como un atributo de cada nodo. Usted verá por qué esto es importante cuando
discutamos la implementación del operador del.
Otro aspecto interesante de la implementación de NodoArbol en el Programa 2 es que usamos
parámetros opcionales de Python. Los parámetros opcionales facilitan la creación de
un NodoArbol bajo diferentes circunstancias. A veces queremos construir un
nuevo NodoArbol que ya tenga padre e hijo. Con un padre y un hijo existentes, podemos
pasar padres e hijos como parámetros. En otras ocasiones, simplemente crearemos
un NodoArbol con la pareja clave-valor, y no pasaremos ningún parámetro padreo hijo. En
este caso, se utilizan los valores por defecto de los parámetros opcionales.
Programa 2
class NodoArbol:
def __init__(self,clave,valor,izquierdo=None,derecho=None,
padre=None):
self.clave = clave
self.cargaUtil = valor
self.hijoIzquierdo = izquierdo
self.hijoDerecho = derecho
self.padre = padre
def tieneHijoIzquierdo(self):
return self.hijoIzquierdo
def tieneHijoDerecho(self):
return self.hijoDerecho
def esHijoIzquierdo(self):
return self.padre and self.padre.hijoIzquierdo == self
def esHijoDerecho(self):
return self.padre and self.padre.hijoDerecho == self
def esRaiz(self):
return not self.padre
def esHoja(self):
return not (self.hijoDerecho or self.hijoIzquierdo)
def tieneAlgunHijo(self):
return self.hijoDerecho or self.hijoIzquierdo
def tieneAmbosHijos(self):
return self.hijoDerecho and self.hijoIzquierdo
def reemplazarDatoDeNodo(self,clave,valor,hizq,hder):
self.clave = clave
self.cargaUtil = valor
self.hijoIzquierdo = hizq
self.hijoDerecho = hder
if self.tieneHijoIzquierdo():
self.hijoIzquierdo.padre = self
if self.tieneHijoDerecho():
self.hijoDerecho.padre = self
Download