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