<jupyter_start><jupyter_text><jupyter_code>class NodoArbol:
    def __init__( self , dato ,  hijo_izq=None , hijo_der=None):
        self.dato = dato
        self.left = hijo_izq
        self.right = hijo_der<jupyter_output><empty_output><jupyter_text>Arbol binario de busqueda

Los nodos a la izq son menores a la raiz y los nodos a la derecha son mayores a la raiz.
Pueden ser recorridos en: pre-orden, in-orden y post-orden<jupyter_code>class BinarySearchTree:
    def __init__( self ):
        self.__root = None

    def insert( self , value ):
        if self.__root == None:
            self.__root = NodoArbol(value,None,None)
        else:
            #Preguntar si value es menor que root, de ser el caso
            #insertar a la izq... Pero puede ser el caso que el
            #sub arbol izq ya tenga muchos elementos
            self.__insert_nodo__(self.__root , value)

    def __insert_nodo__( self , nodo , value ):
        if nodo.dato == value:
            pass
        elif value < nodo.dato: #Si es True va a la izquierda
            if nodo.left == None: #Si hay espacio en la izquierda, ahi le toca
                nodo.left = NodoArbol(value,None,None) #Insertamos el Nodo
            else: 
                self.__insert_nodo__( nodo.left , value )#Buscar su posicion en subarbol izquierdo
        else: #Ir a la derecha
            if nodo.right == None:
                nodo.right =  NodoArbol(value,None,None)
            else: 
                self.__insert_nodo__(nodo.right,value)#Buscar su posicion en subarbol derecho 

    def buscar( self , value ):
          if self.__root == None:
              return None
          else:
              return self.__busca_nodo( self.__root , value )

    def __busca_nodo( self , nodo , value ):
          if nodo == None: 
              return None
          elif nodo.dato == value:
              return nodo.dato
          elif value < nodo.dato:
              return self.__busca_nodo( nodo.left , value )
          else:
              return self.__busca_nodo( nodo.right , value )
    
    def transversal( self , format = "inorden" ):
        if format == "inorden":
            self.__recorrido_in(self.__root)
        elif format == "preorden" :
            self.__recorrido_pre(self.__root)
        elif format =="posorden":
            self.__recorrido_pos(self.__root)
        else: 
          print("Formato de recorrido no valido")

    def __recorrido_pre(self , nodo):
        if nodo != None:
            print (nodo.dato, end=",")
            self.__recorrido_pre(nodo.left)
            self.__recorrido_pre(nodo.right)

    def __recorrido_in(self, nodo):
        if nodo != None:
            self.__recorrido_in(nodo.left)
            print(nodo.dato, end=",")
            self.__recorrido_in(nodo.right)

    def __recorrido_pos(self,nodo):
        if nodo != None:
            self.__recorrido_pos(nodo.left)
            self.__recorrido_pos(nodo.right)
            print(nodo.dato, end=",")


bst = BinarySearchTree()
bst.insert(50)
bst.insert(40)
bst.insert(80)
bst.insert(20)
bst.insert(45)
bst.insert(60)
bst.insert(90)
bst.insert(85)
bst.insert(100)
bst.insert(95)
res = bst.buscar(30)#True or False
print("Dato: "+str(res))
print(bst.buscar(40))
print(bst.buscar(14))
print("Recorrido: ")
print("Preorden")
bst.transversal(format="preorden")
print("\nInorden")
bst.transversal(format="inorden")
print("\nPosorden")
bst.transversal(format="posorden")

print("\n\nArbol Binario Busqueda")
print("                     50")
print("            40                80")
print("      20          45     60         90")
print("                               85         100")
print("                                     95")<jupyter_output>Dato: None
40
None
Recorrido: 
Preorden
50,40,20,45,80,60,90,85,100,95,
Inorden
20,40,45,50,60,80,85,90,95,100,
Posorden
20,45,40,60,85,95,100,90,80,50,

Arbol Binario Busqueda
                     50
            40                80
      20          45     60         90
                               85         100
                                     95
{'fraction_non_alphanumeric': 0.10064393036012402, 'fraction_numerical': 0.03195802528022895, 'mean_word_length': 1.7592105263157896, 'pattern_counts': {'":': 2, '<': 10, '<?xml version=': 0, '>': 8, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '385896', 'license': 'MIT', 'n_tokens_mistral': 1460, 'n_tokens_neox': 1372, 'n_words': 318, 'path': 'Tarea11ArbolBinarioBusqueda.ipynb', 'repo_name': 'MarcoIvanNajeraDiaz/daa_2021_1', 'size': '4193'}