Advertisement
Guest User

Untitled

a guest
Dec 5th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.87 KB | None | 0 0
  1. class TreeNode:
  2. def __init__(self, key, left=None, right=None, parent=None):
  3. self.key = key
  4. self.leftChild = left
  5. self.rightChild = right
  6. self.parent = parent
  7.  
  8. def hasLeftChild(self):
  9. return self.leftChild
  10.  
  11. def hasRightChild(self):
  12. return self.rightChild
  13.  
  14. def isLeftChild(self):
  15. return self.parent and self.parent.leftChild == self
  16.  
  17. def isRightChild(self):
  18. return self.parent and self.parent.rightChild == self
  19.  
  20. def isRoot(self):
  21. return not self.parent
  22.  
  23. def isLeaf(self):
  24. return not (self.rightChild or self.leftChild)
  25.  
  26. def hasAnyChildren(self):
  27. return self.rightChild or self.leftChild
  28.  
  29. def hasBothChildren(self):
  30. return self.rightChild and self.leftChild
  31.  
  32. def replaceNodeData(self, key, lc, rc):
  33. self.key = key
  34. self.leftChild = lc
  35. self.rightChild = rc
  36. if self.hasLeftChild():
  37. self.leftChild.parent = self
  38. if self.hasRightChild():
  39. self.rightChild.parent = self
  40.  
  41.  
  42. class BinarySearchTree:
  43. def __init__(self):
  44.  
  45. self.root = None
  46. self.size = 0
  47.  
  48. def length(self):
  49. return self.size
  50.  
  51. def __len__(self):
  52. return self.size
  53.  
  54. def put(self, key):
  55. if self.root:
  56. self._put(key, self.root)
  57. else:
  58. self.root = TreeNode(key)
  59. self.size = self.size + 1
  60.  
  61. def _put(self, key, currentNode):
  62. if key < currentNode.key:
  63. if currentNode.hasLeftChild():
  64. self._put(key, currentNode.leftChild)
  65. else:
  66. currentNode.leftChild = TreeNode(key, parent=currentNode)
  67. else:
  68. if currentNode.hasRightChild():
  69. self._put(key, currentNode.rightChild)
  70. else:
  71. currentNode.rightChild = TreeNode(key, parent=currentNode)
  72.  
  73. def __setitem__(self, k):
  74. self.put(k)
  75.  
  76. def get(self, key):
  77. if self.root:
  78. res = self._get(key, self.root)
  79. if res:
  80. return res.payload
  81. else:
  82. return None
  83. else:
  84. return None
  85.  
  86. def _get(self, key, currentNode):
  87. if not currentNode:
  88. return None
  89. elif currentNode.key == key:
  90. return currentNode
  91. elif key < currentNode.key:
  92. return self._get(key, currentNode.leftChild)
  93. else:
  94. return self._get(key, currentNode.rightChild)
  95.  
  96. def __getitem__(self, key):
  97. return self.get(key)
  98.  
  99. def __contains__(self, key):
  100. if self._get(key, self.root):
  101. return True
  102. else:
  103. return False
  104.  
  105. def delete(self, key):
  106. if self.size > 1:
  107. nodeToRemove = self._get(key, self.root)
  108. if nodeToRemove:
  109. self.remove(nodeToRemove)
  110. self.size = self.size - 1
  111. else:
  112. raise KeyError('Error, key not in tree')
  113. elif self.size == 1 and self.root.key == key:
  114. self.root = None
  115. self.size = self.size - 1
  116. else:
  117. raise KeyError('Error, key not in tree')
  118.  
  119. def __delitem__(self, key):
  120. self.delete(key)
  121.  
  122. def spliceOut(self):
  123. if self.isLeaf():
  124. if self.isLeftChild():
  125. self.parent.leftChild = None
  126. else:
  127. self.parent.rightChild = None
  128. elif self.hasAnyChildren():
  129. if self.hasLeftChild():
  130. if self.isLeftChild():
  131. self.parent.leftChild = self.leftChild
  132. else:
  133. self.parent.rightChild = self.leftChild
  134. self.leftChild.parent = self.parent
  135. else:
  136. if self.isLeftChild():
  137. self.parent.leftChild = self.rightChild
  138. else:
  139. self.parent.rightChild = self.rightChild
  140. self.rightChild.parent = self.parent
  141.  
  142. def findSuccessor(self):
  143. succ = None
  144. if self.root.hasRightChild():
  145. succ = self.findMin()
  146. else:
  147. if self.parent:
  148. if self.isLeftChild():
  149. succ = self.parent
  150. else:
  151. self.parent.rightChild = None
  152. succ = self.parent.findSuccessor()
  153. self.parent.rightChild = self
  154. return succ
  155.  
  156. def findMin(self):
  157. current = self.root
  158. while current.hasLeftChild():
  159. current = current.leftChild
  160. return current.key
  161.  
  162. def findMax(self):
  163. current = self.root
  164. while current.hasRightChild():
  165. current = current.rightChild
  166. return current.key
  167.  
  168. def remove(self, currentNode):
  169. if currentNode.isLeaf(): # leaf
  170. if currentNode == currentNode.parent.leftChild:
  171. currentNode.parent.leftChild = None
  172. else:
  173. currentNode.parent.rightChild = None
  174. elif currentNode.hasBothChildren(): # interior
  175. succ = currentNode.findSuccessor()
  176. succ.spliceOut()
  177. currentNode.key = succ.key
  178.  
  179. else: # this node has one child
  180. if currentNode.hasLeftChild():
  181. if currentNode.isLeftChild():
  182. currentNode.leftChild.parent = currentNode.parent
  183. currentNode.parent.leftChild = currentNode.leftChild
  184. elif currentNode.isRightChild():
  185. currentNode.leftChild.parent = currentNode.parent
  186. currentNode.parent.rightChild = currentNode.leftChild
  187. else:
  188. currentNode.replaceNodeData(currentNode.leftChild.key,
  189. currentNode.leftChild.leftChild,
  190. currentNode.leftChild.rightChild)
  191. else:
  192. if currentNode.isLeftChild():
  193. currentNode.rightChild.parent = currentNode.parent
  194. currentNode.parent.leftChild = currentNode.rightChild
  195. elif currentNode.isRightChild():
  196. currentNode.rightChild.parent = currentNode.parent
  197. currentNode.parent.rightChild = currentNode.rightChild
  198. else:
  199. currentNode.replaceNodeData(currentNode.rightChild.key,
  200. currentNode.rightChild.leftChild,
  201. currentNode.rightChild.rightChild)
  202.  
  203. def direct(self):
  204. current = self.root
  205. self.directHelp(current)
  206.  
  207.  
  208. def directHelp(self, current):
  209. print(current.key)
  210. if current.hasLeftChild():
  211. self.directHelp(current.leftChild)
  212. if current.hasRightChild():
  213. self.directHelp(current.rightChild)
  214.  
  215.  
  216. def symmetric(self):
  217. current = self.root
  218. self.symmetricHelp(current)
  219.  
  220.  
  221. def symmetricHelp(self, current):
  222. if current.hasLeftChild():
  223. self.symmetricHelp(current.leftChild)
  224. print(current.key)
  225. if current.hasRightChild():
  226. self.symmetricHelp(current.rightChild)
  227.  
  228.  
  229. def back(self):
  230. current = self.root
  231. self.backHelp(current)
  232.  
  233.  
  234. def backHelp(self, current):
  235. if current.hasLeftChild():
  236. self.backHelp(current.leftChild)
  237. if current.hasRightChild():
  238. self.backHelp(current.rightChild)
  239. print(current.key)
  240.  
  241. def deletedHelp(self, p, current):
  242. if current.hasLeftChild():
  243. self.delHelp(current.leftChild)
  244. if current.hasRightChild():
  245. self.delHelp(current.rightChild)
  246. if current.key == p:
  247. self.delete(current.key)
  248.  
  249. def deleted(self, p):
  250. current = self.root
  251. self.deletedHelp(current, p)
  252.  
  253. def delpar(self):
  254. current = self.root
  255. self.delHelp(current)
  256.  
  257. def delHelp(self, current):
  258. if current.hasLeftChild():
  259. self.delHelp(current.leftChild)
  260. if current.hasRightChild():
  261. self.delHelp(current.rightChild)
  262. if current.key % 2 == 0:
  263. self.delete(current.key)
  264.  
  265. def countOfEl(self, val):
  266. current = self.root
  267. i=0
  268. return self.countOfElHelp(current, val, i)
  269.  
  270.  
  271. def countOfElHelp(self, current, val, i):
  272. if current.hasLeftChild():
  273. i=self.countOfElHelp(current.leftChild, val, i)
  274. if current.hasRightChild():
  275. i=self.countOfElHelp(current.rightChild, val, i)
  276. if current.key == val:
  277. i+=1
  278. return i
  279.  
  280. def sum(self):
  281. current = self.root
  282. i=0
  283. return self.sumHelp(current, i)
  284.  
  285.  
  286. def sumHelp(self, current, i):
  287. if current.hasLeftChild():
  288. i=self.sumHelp(current.leftChild, i)
  289. if current.hasRightChild():
  290. i=self.sumHelp(current.rightChild, i)
  291. i += current.key
  292. return i
  293.  
  294. #from tree import *
  295.  
  296. a = BinarySearchTree()
  297.  
  298.  
  299. print ('1. Добавить элемент.')
  300. print ('2. Удалить введенный элемент.')
  301. print ('3. Максимальное значение.')
  302. print ('4. Минимальное значение.')
  303. print ('5. Удалить все парные элементы.')
  304. print ('6. Количество элементов в дереве.')
  305. print ('7. Сумма всех элементов.')
  306. print ('8. Симметрический обход.')
  307. print ('9. Количество повторений элемента в дереве.')
  308. print ('10. Обратный обход.')
  309. print ('11. Прямой обход.')
  310.  
  311. def pr():
  312. k = int(input('enter: '))
  313. if k == 1:
  314. p = int(input('Введите элемент, который хотите добавить в дерево: '))
  315. a.put(p)
  316. pr()
  317. elif k == 2:
  318. d = int(input('Какой элемент Вы хотели бы удалить из дерева? '))
  319. a.delete(d)
  320. pr()
  321. elif k == 3:
  322. print(a.findMax())
  323. pr()
  324. elif k == 4:
  325. print(a.findMin())
  326. pr()
  327. elif k == 5:
  328. a.delpar()
  329. pr()
  330. elif k == 6:
  331. print(a.length())
  332. pr()
  333. elif k == 7:
  334. print(a.sum())
  335. pr()
  336. elif k == 8:
  337. print (a.symmetric())
  338. pr()
  339. elif k == 9:
  340. o = int(input('Введите интересующее Вас значение: '))
  341. print(a.countOfEl(o))
  342. pr()
  343. elif k == 10:
  344. print (a.back())
  345. pr()
  346. elif k == 11:
  347. print (a.direct())
  348. pr()
  349. else:
  350. print ('Такого пункта меню нет:(')
  351. pr()
  352. pr()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement