Advertisement
Guest User

Untitled

a guest
Mar 29th, 2020
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.29 KB | None | 0 0
  1. from random import randint
  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 print_pre_order(node):
  12. print(node.value)
  13. if node.left is not None:
  14. print_pre_order(node.left)
  15. if node.right is not None:
  16. print_pre_order(node.right)
  17.  
  18.  
  19. def print_in_order(node):
  20. if node.left is not None:
  21. print_in_order(node.left)
  22. print(node.value)
  23. if node.right is not None:
  24. print_in_order(node.right)
  25.  
  26.  
  27. def insert_to_bst(root, node, height):
  28. # gdy wstawiana liczba jest mniejsza lub równa korzeniowi
  29. if node.value <= root.value:
  30. # gdy korzen nie ma lewego dziecka
  31. if root.left is None:
  32. # lewym dzieckiem staje sie wstawiana liczba
  33. root.left = node
  34. # wysokość zwiększa się o 1 i jest zwracana
  35. return height + 1
  36. else:
  37. # w przeciwnym razie wywolaj funkcje wstawiajaca dla lewego dziecka jako korzen
  38. # przesuwamy sie w dół drzewa wiec wysokość zwiększa się o 1
  39. height = insert_to_bst(root.left, node, height + 1)
  40. # gdy wstawiana liczba jest wieksza od korzenia
  41. else:
  42. # gdy korzen nie ma prawego dziecka
  43. if root.right is None:
  44. # prawym dzieckiem staje sie wstawiana liczba
  45. root.right = node
  46. # wysokość zwiększa się o 1 i jest zwracana
  47. return height + 1
  48. else:
  49. # w przeciwnym razie wywolaj funkcje wstawiajaca dla prawego dziecka jako korzen
  50. # przesuwamy sie w dół drzewa wiec wysokość zwiększa się o 1
  51. height = insert_to_bst(root.right, node, height + 1)
  52. # zwracamy wysokość drzewa
  53. return height
  54.  
  55.  
  56. # minimum dla bst to po prostu skrajnie lewy lisc
  57. def bst_min(node):
  58. # wypisz obecny wezel
  59. print(node.value)
  60. # jak wezel nie ma lewego dziecka to zwracana jest jego wartosc
  61. if node.left is None:
  62. return node.value
  63. # w przeciwnym razie wywolaj ta funkcje dla lewego dziecka
  64. else:
  65. return bst_min(node.left)
  66.  
  67.  
  68. # dziala analogicznie do bst_min
  69. def bst_max(node):
  70. print(node.value)
  71. if node.right is None:
  72. return node.value
  73. else:
  74. return bst_max(node.right)
  75.  
  76.  
  77. def delete_tree(node):
  78. if node.left is not None:
  79. delete_tree(node.left)
  80. if node.right is not None:
  81. delete_tree(node.right)
  82. node.value = None
  83.  
  84.  
  85. def bst_min_for_delete(node):
  86. if node.left is None:
  87. return node.value
  88. else:
  89. return bst_min_for_delete(node.left)
  90.  
  91.  
  92. def delete_node(node, number): # na starcie na wejsciu jako node podajemy root
  93. # funkcja wykonuje sie az node nie bedzie pusty (dlaczego tak jest wyjasnione pozniej)
  94. if not node:
  95. return node
  96. # opcja 1: znalezlismy liczbe do usuniecia
  97. elif node.value == number:
  98. # opcja 1.1: nie ma prawego - za usuniety dajemy lewy, a reszta jest okej, tylko trzeba ja przestawic
  99. if not node.right:
  100. return node.left
  101. # opcja 1.2: nie ma lewego - za usuniety dajemy prawy, a reszta jest okej, tylko trzeba ja przestawic
  102. if not node.left:
  103. return node.right
  104. # opcja 1.3: sa 2 dzieci - za usuniety dajemy prawy, bo jest wiekszy, ale trzeba poprzestawiac reszte
  105. # nalezy znalesc najmniejszy, bo mozna powiedziec, ze pole z nim zniknie (patrz pierwszy if), a reszta sie przestawi
  106. lowest_node = node.right
  107. while lowest_node.left:
  108. lowest_node = lowest_node.left
  109. node.value = lowest_node.value
  110. node.right = delete_node(node.right, node.value)
  111. # opcja 2: dalej szukamy liczby do usuniecia
  112. elif node.value > number:
  113. node.left = delete_node(node.left, number)
  114. elif node.value < number:
  115. node.right = delete_node(node.right, number)
  116. return node
  117.  
  118.  
  119. def build_AVL(numbers, i, j):
  120. if i > j:
  121. return None
  122. mid = (i + j) // 2
  123. root = Node(numbers[mid])
  124. root.left = build_AVL(numbers, i, mid-1)
  125. root.right = build_AVL(numbers, mid + 1, j)
  126. return root
  127.  
  128. numbers = sorted([randint(0, 20) for x in range(0, 10)])
  129. print(numbers)
  130. tree_root = build_AVL(numbers, 0, len(numbers)-1)
  131. print_in_order(tree_root)
  132.  
  133.  
  134.  
  135.  
  136.  
  137.  
  138. # ustalamy wartosc dla korzenia
  139. # tree_root = Node(randint(0, 20))
  140. # losujemy pozostale numery
  141. # numbers = [randint(0, 20) for x in range(0, 9)]
  142. # max_height = 0
  143. # for number in numbers:
  144. # tree_height = 0
  145. # #wstawiamy nowy wezel do drzewa, funkcja zwróci wysokość na ktorej wezel został wstawiony
  146. # tree_height = insert_to_bst(tree_root, Node(number), tree_height)
  147. # #porownojemy czy wysokosc jest najwieksza do tej pory
  148. # if tree_height > max_height:
  149. # #i ewentualnie podmieniamy
  150. # max_height = tree_height
  151. # print("Ciąg:", [tree_root.value] + numbers)
  152. # print("Wysokosc drzewa:", max_height)
  153. # print("Sciezka do minimum:")
  154. # bst_min(tree_root)
  155. # print("Sciezka do maksimum:")
  156. # bst_max(tree_root)
  157. # print("Elementy w kolejnosci pre-order")
  158. # print_pre_order(tree_root)
  159. # print("Elementy w kolejnosci in-order")
  160. # print_in_order(tree_root)
  161. # #usuniecie drzewa
  162. # delete_tree(tree_root)
  163. # delete_node(tree_root, 7)
  164. # print_in_order(tree_root)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement