<jupyter_start><jupyter_text><jupyter_code>class NodoArbol:
  def __init__(self, value, left=None, right=None):
    self.data=value
    self.left=left
    self.right=right

class BinarySearchTree:

  def __init__(self):
    self.__root=None

  def insert(self, value):
    if self.__root==None:
       self.__root= NodoArbol(value,None,None)
    else:
      self._insert_nodo_(self.__root,value)
  
  def _insert_nodo_(self,nodo,value):
    if nodo.data==value:
      pass
    elif value<nodo.data: 
      if nodo.left==None: 
        nodo.left=NodoArbol(value,None,None)
      else: 
        self._insert_nodo_(nodo.left,value)
    else:
      if nodo.right==None:
        nodo.right=NodoArbol(value,None,None)
      else:
        self._insert_nodo_(nodo.right,value)
  
  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 False
     elif nodo.data==value:
       return nodo.data
     elif value< nodo.data:
       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("Fotmato de recorrido no valido")
  
  def __recorrido_pre(self, nodo):
    if nodo != None:
      print(nodo.data, 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.data, 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.data, end=",")

  def eliminar(self, value):
    self.__eliminar_nodo(self.__root, self.__root, self.__root, None, value)

  def __eliminar_nodo(self, root, nodo, anterior, actual, value):
    if nodo==None:
      return print("No existe el nodo")
    if nodo.data==value:
      if nodo.left==None and nodo.right==None: #ya esta
        if actual=="izq":
          anterior.left=None
        elif actual=="der":
          anterior.right=None
        print("se borro el nodo")
      elif nodo.left==None and nodo.right!=None:
        if actual=="izq":
          anterior.left=nodo.right
        else:
          anterior.right=nodo.right
        print("Nodo derecho hacia arriba")
      elif nodo.left!=None and nodo.right==None:
        if actual=="izq":
          anterior.left=nodo.left
        else:
          anterior.right=nodo.left
        print("Nodo izquierdo hacia arriba")
      elif nodo.left!=None and nodo.right!=None:
        tmp,anterior2 =self.nodoMasBajo(nodo.right, nodo)
        if nodo.data==anterior2.data:
          anterior2.right=tmp.right
        elif nodo.data!=anterior2.data:
          anterior2.left=tmp.right
        if actual=="izq":
          anterior.left=tmp
        else:
          anterior.right=tmp
        tmp.left=nodo.left
        tmp.right=nodo.right
    elif value<nodo.data:
      return self.__eliminar_nodo(root, nodo.left, nodo, "izq", value)
    else:
      return self.__eliminar_nodo(root, nodo.right, nodo, "der", value)
    
  def nodoMasBajo(self, nodo, anterior):
    if nodo.left==None:
      return nodo, anterior
    elif nodo.left!=None:
      return self.nodoMasBajo(nodo.left, nodo)

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)
print("Dato:"+ str(res))
print(bst.buscar(40))
print("recorrido preorden:")
bst.transversal(format="preorden")
print('\n'"recorrido inorden:")
bst.transversal()
print('\n'"recorrido posorden:")
bst.transversal(format="posorden")
bst.eliminar(80)
print('\n'"recorrido posorden:")
bst.transversal(format="posorden")<jupyter_output>Dato:False
40
recorrido preorden:
50,40,20,45,80,60,90,85,100,95,
recorrido inorden:
20,40,45,50,60,80,85,90,95,100,
recorrido posorden:
20,45,40,60,85,95,100,90,80,50,
recorrido posorden:
20,45,40,60,95,100,90,85,50,
{'fraction_non_alphanumeric': 0.1298932384341637, 'fraction_numerical': 0.025800711743772242, 'mean_word_length': 2.7443796835970025, 'pattern_counts': {'":': 8, '<': 7, '<?xml version=': 0, '>': 4, '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': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '623830', 'license': 'MIT', 'n_tokens_mistral': 1732, 'n_tokens_neox': 1668, 'n_words': 276, 'path': 'tarea11.ipynb', 'repo_name': 'GabrielaRodriguez29/daa_2021_1', 'size': '4496'}