MCPcopy Create free account
hub / github.com/ActiveState/code / __fixNodeRemove

Method __fixNodeRemove

recipes/Python/577898_23_Tree/recipe-577898.py:288–384  ·  view source on GitHub ↗

Fix deletion

(self, node, parent = -1)

Source from the content-addressed store, hash-verified

286 node1.values[idx1], node2.values[idx2] = node2.values[idx2], node1.values[idx1]
287
288 def __fixNodeRemove(self, node, parent = -1):
289
290 """ Fix deletion """
291
292 if node.isEmptyNode():
293
294 if node is not self.root:
295
296 if parent == -1:
297 parent = node.parent
298
299 if node.isEmptyNode() or not node.isConsistent():
300
301 lS, lCnt, rS, rCnt = self.__getSiblings(node)
302 rSS, lSS = self.__getRightSibling(rS), self.__getLeftSibling(lS)
303
304 redistribute = True
305
306 if (rS or lS) is not None:
307 if rCnt == 2 or (rCnt == 1 and rSS != None and rSS.valcnt == 2):
308 sib = rS
309 elif lCnt == 2 or (lCnt == 1 and lSS != None and lSS.valcnt == 2):
310 sib = lS
311 elif lCnt == 1:
312 sib, redistribute = lS, False
313 elif rCnt == 1:
314 sib, redistribute = rS, False
315
316 if redistribute:
317 # case 1: redistribute
318 # left and right case
319 if parent.valcnt == 1:
320 if node == parent.getLink(0):
321 parent_val, sib_val = parent.values[0], sib.values[0]
322 child = sib.chooseChild(sib_val - 1)
323 elif node == parent.getLink(1):
324 parent_val, sib_val = parent.values[parent.valcnt - 1], sib.values[sib.valcnt - 1]
325 child = sib.chooseChild(sib_val + 1)
326 else:
327 if sib == parent.getLink(1):
328 # left
329 if node == parent.getLink(0):
330 parent_val, sib_val = parent.values[0], sib.values[0]
331 child = sib.chooseChild(sib_val - 1)
332 # right
333 elif node == parent.getLink(2):
334 parent_val, sib_val = parent.values[parent.valcnt - 1], sib.values[sib.valcnt - 1]
335 child = sib.chooseChild(sib_val + 1)
336 # middle
337 elif sib == parent.getLink(2):
338 parent_val, sib_val = parent.values[parent.valcnt - 1], sib.values[0]
339 child = sib.chooseChild(sib_val - 1)
340 elif sib == parent.getLink(0):
341 parent_val, sib_val = parent.values[0], sib.values[sib.valcnt - 1]
342 child = sib.chooseChild(sib_val + 1)
343
344 node.insertValue(parent_val)
345 parent.removeValue(parent_val)

Callers 1

removeValueMethod · 0.95

Calls 12

__getSiblingsMethod · 0.95
__getRightSiblingMethod · 0.95
__getLeftSiblingMethod · 0.95
isEmptyNodeMethod · 0.80
isConsistentMethod · 0.80
getLinkMethod · 0.80
chooseChildMethod · 0.80
isLeafNodeMethod · 0.80
addLinkMethod · 0.80
removeLinkMethod · 0.80
insertValueMethod · 0.45
removeValueMethod · 0.45

Tested by

no test coverage detected