Guest User

Untitled

a guest
Oct 23rd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.68 KB | None | 0 0
  1. class No:
  2.  
  3. def __init__(self, key, dir, esq):
  4. self.item = key
  5. self.dir = dir
  6. self.esq = esq
  7.  
  8. class Tree:
  9.  
  10. def __init__(self):
  11. self.root = No(None,None,None)
  12. self.root = None
  13.  
  14. def inserir(self, v):
  15. novo = No(v,None,None) # cria um novo Nó
  16. if self.root == None:
  17. self.root = novo
  18. else: # se nao for a raiz
  19. atual = self.root
  20. while True:
  21. anterior = atual
  22. if v <= atual.item: # ir para esquerda
  23. atual = atual.esq
  24. if atual == None:
  25. anterior.esq = novo
  26. return
  27. # fim da condição ir a esquerda
  28. else: # ir para direita
  29. atual = atual.dir
  30. if atual == None:
  31. anterior.dir = novo
  32. return
  33. # fim da condição ir a direita
  34.  
  35. def buscar(self, chave):
  36. if self.root == None:
  37. return None # se arvore vazia
  38. atual = self.root # começa a procurar desde raiz
  39. while atual.item != chave: # enquanto nao encontrou
  40. if chave < atual.item:
  41. atual = atual.esq # caminha para esquerda
  42. else:
  43. atual = atual.dir # caminha para direita
  44. if atual == None:
  45. return None # encontrou uma folha -> sai
  46. return atual # terminou o laço while e chegou aqui é pq encontrou item
  47.  
  48. # O sucessor é o Nó mais a esquerda da subarvore a direita do No que foi passado como parametro do metodo
  49. def nosucessor(self, apaga): # O parametro é a referencia para o No que deseja-se apagar
  50. paidosucessor = apaga
  51. sucessor = apaga
  52. atual = apaga.dir # vai para a subarvore a direita
  53.  
  54. while atual != None: # enquanto nao chegar no Nó mais a esquerda
  55. paidosucessor = sucessor
  56. sucessor = atual
  57. atual = atual.esq # caminha para a esquerda
  58.  
  59. # *********************************************************************************
  60. # quando sair do while "sucessor" será o Nó mais a esquerda da subarvore a direita
  61. # "paidosucessor" será o o pai de sucessor e "apaga" o Nó que deverá ser eliminado
  62. # *********************************************************************************
  63. if sucessor != apaga.dir: # se sucessor nao é o filho a direita do Nó que deverá ser eliminado
  64. paidosucessor.esq = sucessor.dir # pai herda os filhos do sucessor que sempre serão a direita
  65. # lembrando que o sucessor nunca poderá ter filhos a esquerda, pois, ele sempre será o
  66. # Nó mais a esquerda da subarvore a direita do Nó apaga.
  67. # lembrando também que sucessor sempre será o filho a esquerda do pai
  68. sucessor.dir = apaga.dir # guardando a referencia a direita do sucessor para
  69. # quando ele assumir a posição correta na arvore
  70. return sucessor
  71.  
  72. def remover(self, v):
  73. if self.root == None:
  74. return False # se arvore vazia
  75. atual = self.root
  76. pai = self.root
  77. filho_esq = True
  78. # ****** Buscando o valor **********
  79. while atual.item != v: # enquanto nao encontrou
  80. pai = atual
  81. if v < atual.item: # caminha para esquerda
  82. atual = atual.esq
  83. filho_esq = True # é filho a esquerda? sim
  84. else: # caminha para direita
  85. atual = atual.dir
  86. filho_esq = False # é filho a esquerda? NAO
  87. if atual == None:
  88. return False # encontrou uma folha -> sai
  89. # fim laço while de busca do valor
  90.  
  91. # **************************************************************
  92. # se chegou aqui quer dizer que encontrou o valor (v)
  93. # "atual": contem a referencia ao No a ser eliminado
  94. # "pai": contem a referencia para o pai do No a ser eliminado
  95. # "filho_esq": é verdadeiro se atual é filho a esquerda do pai
  96. # **************************************************************
  97.  
  98. # Se nao possui nenhum filho (é uma folha), elimine-o
  99. if atual.esq == None and atual.dir == None:
  100. if atual == self.root:
  101. self.root = None # se raiz
  102. else:
  103. if filho_esq:
  104. pai.esq = None # se for filho a esquerda do pai
  105. else:
  106. pai.dir = None # se for filho a direita do pai
  107.  
  108. # Se é pai e nao possui um filho a direita, substitui pela subarvore a direita
  109. elif atual.dir == None:
  110. if atual == self.root:
  111. self.root = atual.esq # se raiz
  112. else:
  113. if filho_esq:
  114. pai.esq = atual.esq # se for filho a esquerda do pai
  115. else:
  116. pai.dir = atual.esq # se for filho a direita do pai
  117.  
  118. # Se é pai e nao possui um filho a esquerda, substitui pela subarvore a esquerda
  119. elif atual.esq == None:
  120. if atual == self.root:
  121. self.root = atual.dir # se raiz
  122. else:
  123. if filho_esq:
  124. pai.esq = atual.dir # se for filho a esquerda do pai
  125. else:
  126. pai.dir = atual.dir # se for filho a direita do pai
  127.  
  128. # Se possui mais de um filho, se for um avô ou outro grau maior de parentesco
  129. else:
  130. sucessor = self.nosucessor(atual)
  131. # Usando sucessor que seria o Nó mais a esquerda da subarvore a direita do No que deseja-se remover
  132. if atual == self.root:
  133. self.root = sucessor # se raiz
  134. else:
  135. if filho_esq:
  136. pai.esq = sucessor # se for filho a esquerda do pai
  137. else:
  138. pai.dir = sucessor # se for filho a direita do pai
  139. sucessor.esq = atual.esq # acertando o ponteiro a esquerda do sucessor agora que ele assumiu
  140. # a posição correta na arvore
  141.  
  142. return True
  143.  
  144. def inOrder(self, atual):
  145. if atual != None:
  146. self.inOrder(atual.esq)
  147. print(atual.item,end=" ")
  148. self.inOrder(atual.dir)
  149.  
  150. def preOrder(self, atual):
  151. if atual != None:
  152. print(atual.item,end=" ")
  153. self.preOrder(atual.esq)
  154. self.preOrder(atual.dir)
  155.  
  156. def posOrder(self, atual):
  157. if atual != None:
  158. self.posOrder(atual.esq)
  159. self.posOrder(atual.dir)
  160. print(atual.item,end=" ")
  161.  
  162.  
  163. def altura(self, atual):
  164. if atual == None or atual.esq == None and atual.dir == None:
  165. return 0
  166. else:
  167. if self.altura(atual.esq) > self.altura(atual.dir):
  168. return 1 + self.altura(atual.esq)
  169. else:
  170. return 1 + self.altura(atual.dir)
  171.  
  172. def folhas(self, atual):
  173. if atual == None:
  174. return 0
  175. if atual.esq == None and atual.dir == None:
  176. return 1
  177. return self.folhas(atual.esq) + self.folhas(atual.dir)
  178.  
  179.  
  180. def contarNos(self, atual):
  181. if atual == None:
  182. return 0
  183. else:
  184. return 1 + self.contarNos(atual.esq) + self.contarNos(atual.dir)
  185.  
  186. def minn(self):
  187. atual = self.root
  188. anterior = None
  189. while atual != None:
  190. anterior = atual
  191. atual = atual.esq
  192. return anterior
  193.  
  194. def maxx(self):
  195. atual = self.root
  196. anterior = None
  197. while atual != None:
  198. anterior = atual
  199. atual = atual.dir
  200. return anterior
  201.  
  202. def caminhar(self):
  203. print(" Exibindo em ordem: ",end="")
  204. self.inOrder(self.root)
  205. print("\n Exibindo em pos-ordem: ",end="")
  206. self.posOrder(self.root)
  207. print("\n Exibindo em pre-ordem: ",end="")
  208. self.preOrder(self.root)
  209. print("\n Altura da arvore: %d" %(self.altura(self.root)))
  210. print(" Quantidade de folhas: %d" %(self.folhas(self.root)))
  211. print(" Quantidade de Nós: %d" %(self.contarNos(self.root)))
  212. if self.root != None: # se arvore nao esta vazia
  213. print(" Valor minimo: %d" %(self.minn().item))
  214. print(" Valor maximo: %d" %(self.maxx().item))
  215.  
  216. #### fim da classe ####
  217.  
  218. arv = Tree()
  219. print("Programa Arvore Binaria")
  220. opcao = 0
  221. while opcao != 5:
  222. print("***********************************")
  223. print("Entre com a opcao:")
  224. print(" --- 1: Inserir")
  225. print(" --- 2: Excluir")
  226. print(" --- 3: Pesquisar")
  227. print(" --- 4: Exibir")
  228. print(" --- 5: Sair do programa")
  229. print("***********************************")
  230. opcao = int(input("-> "))
  231. if opcao == 1:
  232. x = int(input(" Informe o valor -> "))
  233. arv.inserir(x)
  234. elif opcao == 2:
  235. x = int(input(" Informe o valor -> "))
  236. if arv.remover(x) == False:
  237. print(" Valor nao encontrado!")
  238. elif opcao == 3:
  239. x = int(input(" Informe o valor -> "))
  240. if arv.buscar(x) != None:
  241. print(" Valor Encontrado")
  242. else:
  243. print(" Valor nao encontrado!")
  244. elif opcao == 4:
  245. arv.caminhar()
  246. elif opcao == 5:
  247. break
Add Comment
Please, Sign In to add comment