Advertisement
Guest User

Untitled

a guest
Jan 29th, 2015
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.67 KB | None | 0 0
  1. __author__ ='Karolina'
  2.  
  3. #inicjowanie klasy wezel-Node
  4. class Node(object):
  5. def __init__(self,klucz):
  6. self.lewySyn = None #do lewego dziecka
  7. self.prawySyn = None #do prawego dziecka
  8. self.klucz = klucz #klucz zapisany w węźle
  9.  
  10. #wstawianie
  11. def insert(self, klucz):
  12. if klucz < self.klucz:
  13. if self.lewySyn is None:
  14. self.lewySyn = Node(klucz)
  15. else:
  16. self.lewySyn.insert(klucz)
  17. else:
  18. if self.prawySyn is None:
  19. self.prawySyn = Node(klucz)
  20. else:
  21. self.prawySyn.insert(klucz)
  22.  
  23.  
  24. class BinaryTree(object):
  25. def __init__(self):
  26. self.root = None # root referencja do korzenia
  27.  
  28. def insert(self, klucz):
  29. if self.root is None:
  30. self.root = Node(klucz)
  31. else:
  32. self.root.insert(klucz)
  33.  
  34. #przechodzenie po drzewie
  35. #preOrder - wzdluzne- najpierw odwiedzamy korzeń poddrzewa, a następnie przechodzimy kolejno lewe i prawe poddrzewo
  36. #inOrder - poprzeczne- najpierw przechodzimy lewe poddrzewo danego węzła, następnie odwiedzamy węzeł i na koniec przechodzimy prawe poddrzewo
  37. #postOrder - wsteczne- najpierw przechodzimy lewe poddrzewo, następnie prawe, a dopiero na końcu przetwarzamy węzeł
  38. def preOrderTreeWalk(self, root):
  39. if root is not None:
  40. print(root.klucz)
  41. if root.lewySyn is not None:
  42. self.preOrderTreeWalk(root.lewySyn)
  43. if root.prawySyn is not None:
  44. self.preOrderTreeWalk(root.prawySyn)
  45.  
  46. def inOrderTreeWalk(self, root):
  47. if root is not None:
  48. if root.lewySyn is not None:
  49. self.inOrderTreeWalk(root.lewySyn)
  50. print(root.klucz)
  51. if root.prawySyn is not None:
  52. self.inOrderTreeWalk(root.prawySyn)
  53.  
  54. def postOrderTreeWalk(self, root):
  55. if root.lewySyn is not None:
  56. self.preOrderTreeWalk(root.lewySyn)
  57. if root.prawySyn is not None:
  58. self.preOrderTreeWalk(root.prawySyn)
  59. print(root.klucz)
  60.  
  61.  
  62.  
  63. #dla każdego węzła wszystkie wartości znajdujące się w poddrzewie
  64. #którego korzeniem jest jego prawy syn mają wartości większe niż on,
  65. #a w poddrzewie którego korzeniem jest lewy syn mniejsze
  66. # przeszukiwanie
  67. def find(self, key):
  68. if Node is None:
  69. return None #nie znaleziono klucza
  70. if key < self.root.klucz:
  71. self.root = self.root.lewySyn
  72. return self.find(key)
  73. elif key > self.root.klucz:
  74. self.root = self.root.prawySyn
  75. return self.find(key)
  76. else: #gdy szukany klucz jest rowny kluczowi danego wezla
  77. return self.klucz
  78.  
  79.  
  80. def children_count(self):
  81. cnt = 0
  82. if self.lewySyn:
  83. cnt +=1
  84. if self.prawySyn:
  85. cnt+=1
  86. return cnt
  87.  
  88. def remove(self, klucz, rodzic):
  89. if Node is not None:
  90. children_count = Node.children_count()
  91. # jezli wezel nie ma dzieci, usuwamy go
  92. if children_count == 0:
  93. if rodzic:
  94. if rodzic.lewySyn is Node:
  95. rodzic.lewySyn = None
  96. else:
  97. rodzic.prawySyn = None
  98. del Node #kasujemy node
  99. else:
  100. self.klucz = None
  101. #usuwany węzeł ma jednego syna: dany węzeł usuwamy,
  102. #a jego syna podstawiamy w miejsce usuniętego węzła
  103. if children_count == 1:
  104. if Node.lewySyn:
  105. n = Node.lewySyn
  106. else:
  107. n = Node.prawySyn
  108. if rodzic:
  109. if rodzic.lewySyn is Node:
  110. rodzic.lewySyn = n
  111. else:
  112. rodzic.prawySyn = n
  113. del Node
  114. else:
  115. self.lewySyn = n.lewySyn
  116. self.prawySyn = n.prawySyn
  117. self.klucz = n.klucz
  118. else:
  119. #jesli wezel ma dwoch synow znajdz nastepce
  120. #usuwany węzeł ma dwóch synów:
  121. # po jego usunięciu wstawiamy w jego miejsce węzeł,
  122. # który jest jego następnikiem lub poprzednikiem
  123. #Następnik i poprzednik to odpowiednio najbardziej
  124. # lewy węzeł w prawym podrzewie, lub najbardziej prawy węzeł węzeł w prawym poddrzewie.
  125. rodzic = Node
  126. nastepca = Node.prawySyn
  127. while nastepca.lewySyn:
  128. rodzic = nastepca
  129. nastepca = nastepca.lewySyn
  130. #zamiana wezla nastepca
  131. Node.klucz = nastepca.klucz
  132. # nowe miejsca dla dzieci
  133. if rodzic.lewySyn == nastepca:
  134. rodzic.lewySyn = nastepca.prawySyn
  135. else:
  136. rodzic.prawySyn = nastepca.prawySyn
  137.  
  138.  
  139. # sprawdzenie czy wartosc jest w drzewie BST
  140. def sprawdz(self, klucz, rodzic = None):
  141. if klucz > self.lewySyn is None:
  142. if self.lewySyn is None:
  143. return None
  144. return self.lewySyn.sprawdz(klucz, self)
  145.  
  146. elif klucz < self.klucz:
  147. if self.prawySyn is None:
  148. return None
  149. return self.prawySyn.sprawdz(klucz, self)
  150.  
  151. else:
  152. return self, rodzic
  153.  
  154.  
  155.  
  156. tree = BinaryTree()
  157. tree.insert(4)
  158. tree.insert(3)
  159. tree.insert(2)
  160. tree.insert(1)
  161. tree.insert(9)
  162. tree.insert(12)
  163. tree.insert(13)
  164. tree.insert(5)
  165. tree.insert(12)
  166. tree.insert(54)
  167. tree.insert(3)
  168. print("\n")
  169. tree.inOrderTreeWalk(tree.root)
  170. print("\n")
  171. tree.preOrderTreeWalk(tree.root)
  172. print("\n")
  173. tree.postOrderTreeWalk(tree.root)
  174. print("\n")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement