Question: class BTreeNodeWithInsert ( BTreeNodeBase ) : def _ _ init _ _ ( self , keys = [ ] , ptrs = [ ] ,
class BTreeNodeWithInsertBTreeNodeBase:
def initself keys ptrs isrootFalse, d :
superinitkeys ptrs isroot, d
def createnewinstanceself keys, ptrs isroot, d:
return BTreeNodeWithInsertkeys ptrs isroot, d
def insertself newkeys:
assert self.isroot
res self.inserthelpernewkeys
if res None :
midkey, n n res
self.isroot False
newroot self.creatnewinstancemidkeyn n True, self.d
nsetparentnewroot,
nsetparentnewroot,
return newroot
else :
return self
def inserthelperself key:
if self.isleaf :
self.insertkeyintolistkey
n lenselfkeys
if n self.d :
return None
else :
return self.handlefullnode
else :
i
n lenselfkeys
while i n and self.keysi key :
i i
if i n and self.keysi key :
if debug :
printfKey k already exists'
return None
else :
res self.pointersiinserthelperkey
if res is None :
midkey, nodeleft, noderight res
self.insertkeyandptrmidkey, nodeleft, noderight
if lenselfkeys self.d :
return self.handlefullnode
def insertkeyintolistself newkey:
assert self.isleaf
n lenselfkeys
assert newkey not in self.keys, f'key newkey already exists selfkeys
self.keys.appendnewkey
i n
while i and self.keysi self.keysi:
selfkeysi self.keysiselfkeysi self.keysi
i i
def insertkeyandptrself midkey, nodeleft, noderight, i:
n lenselfkeys
assert i and i n
nodeleft.setparentself i
assert self.pointersi nodeleft
newkey, newchildmidkey, noderight
for j in rangen i:
self.keysj self.keysj
self.pointersj self.pointersj
self.keysi newkeys
self.pointersi newchild
newchild.setparentself i
self.keys.appendnewkey
self.pointers.appendnewchild
newchild.setparentself n
def fixparentpointersforchildrenself:
for i childnode in enumerateselfpointers :
childnode.setparentself j
def splitnodeself:
assert lenselfkeys self.d
n lenselfkeys
d self.d
midkey self.keysd
newkeys listselfkeysd :
self.keys listselfkeys:d
if self.isleaf :
newptrs
else :
newptrs listselfpointersd:
self.pointers listselfpointers:d
newnode self.createnewinstancenewkeys, newptrs False, d
newnode.fixparentpointersforchildren
return midkey, self, newnode
def handlefullnodeself:
assert lenselfkeys self.d
d self.d
if self.parent None :
return self.splitnode
parentnode, parentidx self.parent
if self.rightsibling and lenselfrightsibling.keys self.d:
parentindex self.parent.pointers.indexself
self.parent.keys.insertparentindex, self.keys.pop
self.rightsibling.keys.insert self.parent.keysparentindex
if not self.isleaf:
fixpointersforchildrenself self.rightsibling
return
elif self.leftsibling and lenselfleftsibling.keys self.d:
parentindex self.parent.pointers.indexself
self.parent.keys.insertparentindex, self.keys.pop
self.leftsibling.keys.appendselfparent.keysparentindex
if not self.isleaf:
fixpointersforchildrenselfleftsibling, self
return
else:
self.splitnode
Cell In line in BTreeNodeWithInsert.handlefullnodeself d self.d if self.parent None : return self.splitnodeparentnode, parentidx self.parent # Check if there is a right sibling and if it can lend a key # Check if there is a right sibling and if it can lend a key AttributeError: 'BTreeNodeWithInsert' object has no attribute 'splitnode'
Step by Step Solution
There are 3 Steps involved in it
1 Expert Approved Answer
Step: 1 Unlock
Question Has Been Solved by an Expert!
Get step-by-step solutions from verified subject matter experts
Step: 2 Unlock
Step: 3 Unlock
