<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.rigth = hijo_der<jupyter_output><empty_output><jupyter_text>Arbol binario de busqueda
Los nodos a la izq son menores a la reiz y los nodos a la derecha son mayores a la reiz.
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 isnertar a la izq; pero puede ser el caso del que
            #el subarbol 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:   #true va a la izq
            if nodo.left == None:
                nodo.left = NodoArbol(value, None, None)
            else:
                self.__insert_nodo__(nodo.left, value)
        else:   #ir a la derecha
            if nodo.rigth == None:
                nodo.rigth = NodoArbol(value, None, None)
            else:
                self.__insert_nodo__(nodo.rigth, value)


    #caso base, si el caso derecho esta vacio, si el caso izquierdo
    def buscar(self, value):
        if self.__root == None:
            return None
        else:  #busquda recursiva
            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.rigth, 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)
            self.__recorrido_pre(nodo.left)
            self.__recorrido_pre(nodo.rigth)

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

    def __recorrido_in(self, nodo):
        if nodo != None:
            self.__recorrido_in(nodo.left)
            print(nodo.dato, end=',') #raiz
            self.__recorrido_in(nodo.rigth)

    def __recorrido_pos(self, nodo):
        if nodo != None:
            self.__recorrido_pos(nodo.left)
            self.__recorrido_pos(nodo.rigth)
            print(nodo.dato, end =',')
bst = BinarySearchTree()
bst.insert(50)
bst.insert(30)
bst.insert(20)
res = bst.buscar(30)
print("Dato : " +str(res))
print(bst.buscar(40))
print("recorrido PREORDEN: ")
bst.transversal(format = 'preorden')

print("recorrido INORDEN: ")
bst.transversal(format = 'inorden')

print("\nrecorrido POSORDEN: ")
bst.transversal(format = 'posorden')<jupyter_output>Dato : 30
None
recorrido PREORDEN: 
50
30
20
recorrido INORDEN: 
20,30,50,
recorrido POSORDEN: 
20,30,50,
{'fraction_non_alphanumeric': 0.09797391063003053, 'fraction_numerical': 0.00832639467110741, 'mean_word_length': 2.046491969568893, 'pattern_counts': {'":': 0, '<': 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': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '2', 'dir': 'jupyter-structured-clean-dedup', 'id': '450177', 'license': 'MIT', 'n_tokens_mistral': 1275, 'n_tokens_neox': 1230, 'n_words': 282, 'path': '18_enero.ipynb', 'repo_name': 'jorge23amury/daa_2021_1', 'size': '3603'}