Guest User

Untitled

a guest
Jan 22nd, 2018
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.19 KB | None | 0 0
  1. class Tree(object):
  2.  
  3. def __init__(self):
  4. self.root = None
  5. self.size = 0
  6.  
  7. def put(self, key, val):
  8. if self.root:
  9. self._put(key, val, self.root)
  10. else:
  11. self.root = Node(key, val)
  12. self.size += 1
  13.  
  14. def get(self, key):
  15. res = self._get(key, self.root)
  16. if res:
  17. return res.val
  18. return None
  19.  
  20. def delete(self, key):
  21. if len(self) > 1:
  22. node_to_delete = self._get(key, self.root)
  23. if not node_to_delete:
  24. raise KeyError('key not in tree')
  25. else:
  26. self._delete(node_to_delete)
  27. self.size -= 1
  28. elif len(self) == 1 and self.root.key == key:
  29. self.root = None
  30. self.size = 0
  31. else:
  32. raise KeyError('key not in tree')
  33.  
  34. def _put(self, key, val, curr_node):
  35. if key < curr_node.key:
  36. if curr_node.left:
  37. self._put(key, val, curr_node.left)
  38. else:
  39. curr_node.left = Node(key, val, parent=curr_node)
  40. else:
  41. if curr_node.right:
  42. self._put(key, val, curr_node.right)
  43. else:
  44. curr_node.right = Node(key, val, parent=curr_node)
  45.  
  46. def _get(self, key, curr_node):
  47. if not curr_node:
  48. return None
  49. if key == curr_node.key:
  50. return curr_node
  51. if key < curr_node.key:
  52. return self._get(key, curr_node.left)
  53. return self._get(key, curr_node.right)
  54.  
  55. def _delete(self, node):
  56. if node.is_leaf():
  57. if node.is_left():
  58. node.parent.left = None
  59. else:
  60. node.parent.right = None
  61. elif node.has_both_children():
  62. succ = node.find_succerror()
  63. succ.splice_out()
  64. node.key = succ.key
  65. node.val = succ.val
  66. else:
  67. if node.left:
  68. if node.is_left():
  69. node.left.parent = node.parent
  70. node.parent.left = node.left
  71. elif node.is_right():
  72. node.left.parent = node.parent
  73. node.parent.right = node.left
  74. else:
  75. node.replace(node.left.key, node.left.val, node.left.left, node.left.right)
  76. else:
  77. if node.is_left():
  78. node.right.parent = node.parent
  79. node.parent.left = node.right
  80. elif node.is_right():
  81. node.right.parent = node.parent
  82. node.parent.right = node.right
  83. else:
  84. node.replace(node.right.key, node.right.val, node.right.left, node.right.right)
  85.  
  86. def __len__(self):
  87. return self.size
  88.  
  89. def __iter__(self):
  90. return self.root.__iter__()
  91.  
  92. def __repr__(self):
  93. return self.root.__repr__()
  94.  
  95. def __setitem__(self, key, val):
  96. self.put(key, val)
  97.  
  98. def __getitem__(self, key):
  99. return self.get(key)
  100.  
  101. def __delitem__(self, key):
  102. self.delete(key)
  103.  
  104. def __contains__(self, key):
  105. return bool(self.get(key))
  106.  
  107.  
  108. class Node(object):
  109.  
  110. def __init__(self, key, val, left=None, right=None, parent=None):
  111. self.key = key
  112. self.val = val
  113. self.left = left
  114. self.right = right
  115. self.parent = parent
  116.  
  117. def is_left(self):
  118. """
  119. >>> p = Node('a', 1)
  120. >>> n = Node('b', 2, parent=p)
  121. >>> p.left = n
  122. >>> assert n.is_left()
  123. """
  124. return self.parent is not None and self.parent.left is self
  125.  
  126. def is_right(self):
  127. """
  128. >>> p = Node('a', 1)
  129. >>> n = Node('b', 2, parent=p)
  130. >>> p.right = n
  131. >>> assert n.is_right()
  132. """
  133. return self.parent is not None and self.parent.right is self
  134.  
  135. def is_root(self):
  136. """
  137. >>> p = Node('a', 1)
  138. >>> n = Node('b', 2, parent=p)
  139. >>> p.right = n
  140. >>> assert p.is_root()
  141. >>> assert not n.is_root()
  142. """
  143. return self.parent is None
  144.  
  145. def is_leaf(self):
  146. """
  147. >>> p = Node('a', 1)
  148. >>> n = Node('b', 2, parent=p)
  149. >>> p.right = n
  150. >>> assert not p.is_leaf()
  151. >>> assert n.is_leaf()
  152. """
  153. return self.left is None and self.right is None
  154.  
  155. def has_any_children(self):
  156. """
  157. >>> p = Node('a', 1)
  158. >>> n = Node('b', 2, parent=p)
  159. >>> p.right = n
  160. >>> assert p.has_any_children()
  161. """
  162. return self.left is not None or self.right is not None
  163.  
  164. def has_both_children(self):
  165. """
  166. >>> p = Node('a', 1)
  167. >>> n1 = Node('b', 2, parent=p)
  168. >>> p.right = n1
  169. >>> n2 = Node('c', 3, parent=p)
  170. >>> p.left = n2
  171. >>> assert p.has_any_children()
  172. >>> assert p.has_both_children()
  173. """
  174. return self.left is not None and self.right is not None
  175.  
  176. def replace(self, key, val, left, right):
  177. self.key = key
  178. self.val = val
  179. self.left = left
  180. self.right = right
  181. if self.left:
  182. self.left.parent = self
  183. if self.right:
  184. self.right.parent = self
  185.  
  186. def find_succerror(self):
  187. succ = None
  188. if self.right:
  189. succ = self.right.find_min()
  190. else:
  191. if self.parent:
  192. if self.is_left():
  193. succ = self.parent
  194. else:
  195. self.parent.right = None
  196. succ = self.parent.find_succerror()
  197. self.parent.right = self
  198. return succ
  199.  
  200. def find_min(self):
  201. res = self
  202. while res.left:
  203. res = res.left
  204. return res
  205.  
  206. def splice_out(self):
  207. if self.is_leaf():
  208. if self.is_left():
  209. self.parent.left = None
  210. else:
  211. self.parent.right = None
  212. else:
  213. if self.left:
  214. if self.is_left():
  215. self.parent.left = self.left
  216. else:
  217. self.parent.right = self.left
  218. self.left.parent = self.parent
  219. else:
  220. if self.is_leaf():
  221. self.parent.left = self.right
  222. else:
  223. self.parent.right = self.right
  224. self.right.parent = self.parent
  225.  
  226. def __iter__(self):
  227. if self:
  228. if self.left:
  229. for ele in self.left:
  230. yield ele
  231. yield self.key
  232. if self.right:
  233. for ele in self.right:
  234. yield ele
  235.  
  236. def __repr__(self):
  237. return '{} --> {}:{} <-- {}'.format(self.left, self.key, self.val, self.right)
  238.  
  239.  
  240. def main():
  241. t = Tree()
  242. print t[3]
  243.  
  244. t[5] = 'e'
  245. print len(t)
  246. print t
  247.  
  248. t[4] = 'd'
  249. print len(t)
  250. print t
  251.  
  252. t[6] = 'f'
  253. print len(t)
  254. print t
  255.  
  256. t[3] = 'c'
  257. print len(t)
  258. print t
  259.  
  260. print t[3]
  261. print t[4]
  262. print t[5]
  263. print t[6]
  264. print t[7]
  265.  
  266. print 7 in t
  267. print 6 in t
  268.  
  269. for ele in t:
  270. print ele
  271.  
  272.  
  273. def test_delete_leaf():
  274. print 'test delete leaf'
  275. t = Tree()
  276. t[2] = 'b'
  277. t[1] = 'a'
  278. t[3] = 'c'
  279. print t
  280. del t[1]
  281. print t
  282. del t[3]
  283. print t
  284.  
  285.  
  286. def test_delete_root():
  287. print 'test delete root'
  288. t = Tree()
  289. print t
  290. t[2] = 'b'
  291. print t
  292. del t[2]
  293. print t
  294.  
  295.  
  296. def test_delete_half():
  297. print 'test delete half'
  298. t = Tree()
  299.  
  300. t[3] = 'c'
  301. t[2] = 'b'
  302. t[1] = 'a'
  303. del t[2]
  304. print t
  305.  
  306. t = Tree()
  307. t[3] = 'c'
  308. t[1] = 'a'
  309. t[2] = 'b'
  310. del t[1]
  311. print t
  312.  
  313. t = Tree()
  314. t[1] = 'a'
  315. t[2] = 'b'
  316. t[3] = 'c'
  317. del t[2]
  318. print t
  319.  
  320. t = Tree()
  321. t[1] = 'a'
  322. t[3] = 'c'
  323. t[2] = 'b'
  324. del t[3]
  325. print t
  326.  
  327. t = Tree()
  328. t[2] = 'b'
  329. t[1] = 'a'
  330. del t[2]
  331. print t
  332.  
  333. t = Tree()
  334. t[2] = 'b'
  335. t[3] = 'c'
  336. del t[2]
  337. print t
  338.  
  339.  
  340. def test_delete_full():
  341. print 'test delete full'
  342. t = Tree()
  343. t[4] = 'd'
  344. t[2] = 'b'
  345. t[1] = 'a'
  346. t[3] = 'c'
  347. print t
  348.  
  349. del t[3]
  350. print t
  351.  
  352. if __name__ == '__main__':
  353. import doctest
  354. doctest.testmod()
  355. main()
  356. test_delete_leaf()
  357. test_delete_root()
  358. test_delete_half()
  359. test_delete_full()
Add Comment
Please, Sign In to add comment