Advertisement
Guest User

Untitled

a guest
Mar 30th, 2020
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.05 KB | None | 0 0
  1. import random
  2.  
  3.  
  4. class Node:
  5. def __init__(self, value):
  6. self.value = value
  7. self.left = None
  8. self.right = None
  9.  
  10.  
  11. def insert_to_bst(root, node, height):
  12. if node.value <= root.value:
  13. if root.left is None:
  14. root.left = node
  15. return height + 1
  16. else:
  17. height = insert_to_bst(root.left, node, height + 1)
  18. else:
  19. if root.right is None:
  20. root.right = node
  21. return height + 1
  22. else:
  23. height = insert_to_bst(root.right, node, height + 1)
  24. return height
  25.  
  26.  
  27. def build_bst(elements):
  28. root = Node(elements[0])
  29. max_height = 0
  30. for i in range(1, len(elements)):
  31. height = 0
  32. height = insert_to_bst(root, Node(elements[i]), height)
  33. if height > max_height:
  34. max_height = height
  35. return root, max_height
  36.  
  37.  
  38. def bst_min(node):
  39. print(node.value)
  40. if node.left is None:
  41. return node.value
  42. else:
  43. return bst_min(node.left)
  44.  
  45.  
  46. def bst_max(node):
  47. print(node.value)
  48. if node.right is None:
  49. return node.value
  50. else:
  51. return bst_max(node.right)
  52.  
  53.  
  54. def delete_node(node, number):
  55. if not node:
  56. return node
  57. elif node.value == number:
  58. if not node.right:
  59. return node.left
  60. if not node.left:
  61. return node.right
  62. lowest_node = node.right
  63. while lowest_node.left:
  64. lowest_node = lowest_node.left
  65. node.value = lowest_node.value
  66. node.right = delete_node(node.right, node.value)
  67. elif node.value > number:
  68. node.left = delete_node(node.left, number)
  69. elif node.value < number:
  70. node.right = delete_node(node.right, number)
  71. return node
  72.  
  73.  
  74. def delete_nodes(node, elements):
  75. for element in elements:
  76. delete_node(node, element)
  77.  
  78.  
  79. def print_pre_order(node):
  80. print(node.value)
  81. if node.left is not None:
  82. print_pre_order(node.left)
  83. if node.right is not None:
  84. print_pre_order(node.right)
  85.  
  86.  
  87. def print_in_order(node):
  88. if node.left is not None:
  89. print_in_order(node.left)
  90. print(node.value)
  91. if node.right is not None:
  92. print_in_order(node.right)
  93.  
  94.  
  95. def delete_tree(node):
  96. if node.left is not None:
  97. delete_tree(node.left)
  98. if node.right is not None:
  99. delete_tree(node.right)
  100. node.value = None
  101.  
  102.  
  103. sequence_type = None
  104. while sequence_type != '0':
  105. print("-----------------------")
  106. print("1.Podaj wlasny ciag")
  107. print("2.Wygeneruj losowy ciag")
  108. print("0.Wyjscie")
  109. print("-----------------------")
  110. sequence_type = input(">")
  111. if sequence_type == '1':
  112. print("Podaj ciag oddzielajac liczby spacjami(np. \"1 2 3\"). Ciag moze miec maksymalnie 10 elementów.")
  113. try:
  114. numbers = [int(x) for x in input('>').split()]
  115. if len(numbers) not in range(1, 11):
  116. print("Nieodpowiednia liczba elementow!")
  117. sequence_type = None
  118. except Exception:
  119. print("Wystapil blad! Niepoprawny format danych.")
  120. sequence_type = None
  121. elif sequence_type == '2':
  122. # TODO moze dodam wiecej opcji(przedzial, wielkosc)
  123. numbers = [random.randint(1, 30) for x in range(0, 10)]
  124. if sequence_type in ['1', '2']:
  125. option = None
  126. tree_built = False
  127. while option != '0':
  128. print("--------------------------------------------------------------")
  129. print("1.Konstruuj nowe drzewo AVL metoda polowienia binarnego")
  130. print("2.Konstruuj nowe drzewo BST wstawiajac elementy ciagu po kolei")
  131. print("3.Znajdz minimum i maksimum oraz wypisz sciezke poszukiwania")
  132. print("4.Usun elementy o podanych wartosciach")
  133. print("5.Wypisz elementy drzewa w porzadkach in-order i pre-order")
  134. print("6.Usun cale drzewo metoda post-order")
  135. print("7.Zrownowaz drzewo przez rotacje")
  136. print("0.Wyjscie")
  137. print("--------------------------------------------------------------")
  138. option = input(">")
  139. if option == '1':
  140. # TODO dodac budowanie drzewa AVL
  141. pass
  142. tree_built = True
  143. elif option == '2':
  144. tree_root, tree_height = build_bst(numbers)
  145. print("Operacja zostala wykonana. Wysokosc drzewa:", tree_height)
  146. input("Wcisnij enter aby kontynuowac...")
  147. tree_built = True
  148. if tree_built:
  149. if option == '3':
  150. print("Sciezka do minimum:")
  151. minimum = bst_min(tree_root)
  152. print("Sciezka do maksimum:")
  153. maximum = bst_max(tree_root)
  154. print("Minimum: {}, Maksimum: {}".format(minimum, maximum))
  155. input("Wcisnij enter aby kontynuowac...")
  156. elif option == '4':
  157. # TODO sprawdzic jak dziala gdy wystepuja duplikaty
  158. print("Podaj liczby do usuniecia oddzielajac je spacjami(np. \"1 2 3\"):")
  159. try:
  160. to_delete = [int(x) for x in input(">").split()]
  161. delete_nodes(tree_root, to_delete)
  162. except Exception:
  163. print("Wystapil blad! Niepoprawny format danych.")
  164. elif option == '5':
  165. print("In-order:")
  166. print_in_order(tree_root)
  167. print("Pre-order")
  168. print_pre_order(tree_root)
  169. input("Wcisnij enter aby kontynuowac...")
  170. elif option == '6':
  171. delete_tree(tree_root)
  172. elif option == '7':
  173. # TODO dodac rownowazenie drzewa
  174. pass
  175. else:
  176. print("--------------------------------------------------------------")
  177. print("Przed skorzystaniem z opcji 3-7 nalezy zbudowac drzewo!")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement