Advertisement
fahadkalil

arv_bin_2022

Sep 1st, 2022
1,225
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.09 KB | None | 0 0
  1. ### Arvore Binaria Não Balanceada
  2. # Estrutura Recursiva
  3. ###
  4. class Nodo:
  5.     """
  6.    Nodo da arvore:
  7.      filhos da esquerda e direita + dado (que pode ser qualquer objeto)
  8.    """
  9.     def __init__(self, dado):
  10.         self.esq = None
  11.         self.dir = None
  12.         self.dado = dado
  13.  
  14.     def __str__(self):
  15.         return str(self.dado)
  16.  
  17.     def __repr__(self):
  18.         return str(self.dado)
  19.  
  20.     def numFilhos(self, alvo):
  21.         num_filhos = 0
  22.         if (alvo.esq is not None):
  23.             num_filhos += 1
  24.  
  25.         if (alvo.dir is not None):
  26.             num_filhos += 1
  27.        
  28.         return num_filhos
  29.  
  30.     def inserir(self, dado):
  31.         """
  32.        Insere um novo nodo com dados
  33.        @param dado a ser inserido
  34.        """
  35.        
  36.         ## Insere na sub-arvore da esquerda
  37.         if dado < self.dado:
  38.             if self.esq is None:
  39.                 # Cria um novo nodo (que sera a sub-arvore da esquerda)
  40.                 self.esq = Nodo(dado)
  41.             else:
  42.                 self.esq.inserir(dado)
  43.  
  44.         ## Insere na sub-arvore da direita
  45.         elif dado > self.dado:
  46.             if self.dir is None:
  47.                 # Cria um novo nodo (que sera a sub-arvore da direita)
  48.                 self.dir = Nodo(dado)
  49.             else:
  50.                 self.dir.inserir(dado)
  51.  
  52.     def buscar(self, alvo, pai=None):      
  53.         # retornar uma tupla contendo o nodo alvo e o pai        
  54.         if alvo == self.dado:
  55.             return self, pai
  56.         else:
  57.             if alvo > self.dado:
  58.                 if self.dir is None:
  59.                     return None, None
  60.                 return self.dir.buscar(alvo, self)
  61.             elif alvo < self.dado:
  62.                 if self.esq is None:
  63.                     return None, None
  64.                 return self.esq.buscar(alvo, self)
  65.    
  66.     def remover(self, alvo, raiz=None): # alvo = valor dentro do nodo
  67.         if raiz is None:
  68.             return raiz
  69.  
  70.         if alvo < raiz.dado:
  71.             raiz.esq = self.remover(alvo, raiz.esq)
  72.         elif alvo > raiz.dado:
  73.             raiz.dir = self.remover(alvo, raiz.dir)
  74.         else:
  75.             if raiz.esq is None:
  76.                 return raiz.dir
  77.             elif raiz.dir is None:
  78.                 return raiz.esq
  79.  
  80.             raiz.dado = self.sucessorEmOrdem(raiz.dir)
  81.             raiz.dir = self.remover(raiz.dado, raiz.dir)
  82.  
  83.         return raiz
  84.  
  85.     def sucessorEmOrdem(self, raiz=None):
  86.         menor = raiz.dado
  87.         while raiz.esq is not None:
  88.             menor = raiz.esq.dado
  89.             raiz = raiz.esq
  90.         return menor
  91.  
  92.     def maximo(self, raiz=None):
  93.         if raiz is not None:
  94.             self = raiz
  95.            
  96.         if self.esq is None and self.dir is None:
  97.             return self.dado
  98.         else:
  99.             if self.dir is not None:
  100.                 return self.maximo(self.dir)
  101.            
  102.             return self.dado
  103.  
  104.     def minimo(self, raiz=None):
  105.         if raiz is not None:
  106.             self = raiz
  107.            
  108.         if self.esq is None and self.dir is None:
  109.             return self.dado
  110.         else:
  111.             if self.esq is not None:
  112.                 return self.minimo(self.esq)
  113.            
  114.             return self.dado
  115.  
  116.     def imprimirDecrescente(self):
  117.         """
  118.        Imprime o conteudo da arvore na tela,
  119.        usando travessia em-ordem REVERSA
  120.        (reverse in-order | arv_dir - raiz - arq_esq)
  121.  
  122.        https://en.wikipedia.org/wiki/Tree_traversal#Reverse_in-order_(RNL)
  123.        """
  124.         if self.dir:
  125.             self.dir.imprimirDecrescente()
  126.  
  127.         # Raiz
  128.         print(self.dado)
  129.  
  130.         if self.esq:
  131.             self.esq.imprimirDecrescente()
  132.        
  133.     def imprimirEmOrdem(self):
  134.         """
  135.        Imprime o conteudo da arvore na tela,
  136.        usando travessia em-ordem (in-order | arv_esq - raiz - arq_dir)
  137.        """
  138.         # Sub-arvore da Esquerda
  139.         if self.esq:            
  140.             self.esq.imprimirEmOrdem()
  141.  
  142.         # Raiz
  143.         print(self.dado)
  144.  
  145.         # Sub-arvore da Direita
  146.         if self.dir:            
  147.             self.dir.imprimirEmOrdem()
  148.  
  149.     def imprimirPreOrdem(self):        
  150.         # Raiz
  151.         print(self.dado)
  152.  
  153.         # Sub-arvore da Esquerda
  154.         if self.esq:            
  155.             self.esq.imprimirPreOrdem()        
  156.  
  157.         # Sub-arvore da Direita
  158.         if self.dir:            
  159.             self.dir.imprimirPreOrdem()
  160.  
  161.     def imprimirPosOrdem(self):
  162.         # Sub-arvore da Esquerda
  163.         if self.esq:            
  164.             self.esq.imprimirPosOrdem()
  165.  
  166.         # Sub-arvore da Direita
  167.         if self.dir:            
  168.             self.dir.imprimirPosOrdem()
  169.  
  170.         # Raiz
  171.         print(self.dado)
  172.  
  173.     def size(self, raiz=None):
  174.         if raiz is None:
  175.             return 0
  176.         else:
  177.             return 1 + self.size(raiz.esq) + self.size(raiz.dir)
  178.  
  179.     def size2(self, raiz=None):        
  180.         if raiz is None: # caso base
  181.             return 0
  182.        
  183.         fila = []
  184.         fila.append(raiz)
  185.              
  186.         count = 0
  187.         while(len(fila) > 0):
  188.             nodo = fila.pop(0)
  189.  
  190.             count = count + 1
  191.            
  192.             if nodo.esq is not None:
  193.                 fila.append(nodo.esq)      
  194.          
  195.             if nodo.dir is not None:
  196.                 fila.append(nodo.dir)
  197.                  
  198.         return count
  199.        
  200. def main():
  201.    
  202.     ## Inserindo...    
  203.    
  204.     nums = [4, 6, 5, 7, 1]    
  205.     raiz = Nodo(nums[0]) # insere o 1o item
  206.        
  207.     for n in nums[1:]: # insere os demais itens
  208.         raiz.inserir(n)
  209.  
  210.     # imprimir de maneira crescente
  211.     raiz.imprimirEmOrdem()
  212.  
  213.     print("remover 4")
  214.     raiz.remover(4, raiz)
  215.  
  216.     raiz.imprimirEmOrdem()
  217.  
  218.     # imprimir de maneira decrescente
  219.     #raiz.imprimirDecrescente()
  220.        
  221.     #print(raiz.buscar(5))
  222.  
  223.     #print(raiz.maximo(raiz))
  224.  
  225.     #print(raiz.size(raiz))
  226.     #print(raiz.size2(raiz))
  227.  
  228.     #raiz.imprimirPreOrdem()
  229.     #raiz.imprimirEmOrdem()
  230.     #raiz.imprimirPosOrdem()
  231.            
  232. if __name__ == "__main__":
  233.     main()
  234.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement