Question: class BTreeNodeWithInsert ( BTreeNodeBase ) : def _ _ init _ _ ( self , keys = [ ] , ptrs = [ ] ,

class BTreeNodeWithInsert(BTreeNodeBase):
def __init__(self, keys =[], ptrs =[], is_root=False, d =10):
super().__init__(keys, ptrs, is_root, d)
def create_new_instance(self, keys, ptrs, is_root, d):
return BTreeNodeWithInsert(keys, ptrs, is_root, d)
def insert(self, new_keys):
assert self.is_root
res = self.insert_helper(new_keys)
if res != None :
[mid_key, n1, n2]= res
self.is_root = False
new_root = self.creat_new_instance([mid_key],[n1, n2], True, self.d)
n1.set_parent(new_root, 0)
n2.set_parent(new_root, 1)
return new_root
else :
return self
def insert_helper(self, key):
if self.is_leaf() :
self.insert_key_into_list(key)
n = len(self.keys)
if n <=2* self.d :
return None
else :
return self.handle_full_node()
else :
i =0
n = len(self.keys)
while i < n and self.keys[i]< key :
i = i +1
if i < n and self.keys[i]== key :
if debug :
print(f'Key {k} already exists')
return None
else :
res = self.pointers[i].insert_helper(key)
if res is None :
(mid_key, node_left, node_right)= res
self.insert_key_and_ptr[mid_key, node_left, node_right]
if len[self.keys]==2* self.d +1 :
return self.handle_full_node()
def insert_key_into_list(self, new_key):
assert self.is_leaf()
n = len(self.keys)
assert new_key not in self.keys, f'key {new_key} already exists {self.keys}'
self.keys.append(new_key)
i = n
while i >=1 and self.keys[i]< self.keys[i-1]:
(self.keys[i-1], self.keys[i])=(self.keys[i], self.keys[i-1])
i = i -1
def insert_key_and_ptr(self, mid_key, node_left, node_right, i):
n = len(self.keys)
assert i >=0 and i <= n
node_left.set_parent(self, i)
assert self.pointers[i]== node_left
(new_key, new_child)=(mid_key, node_right)
for j in range(n, i,-1):
self.keys[j]= self.keys[j -1]
self.pointers[j +1]= self.pointers[j]
self.keys[i]= new_keys
self.pointers[i +1]= new_child
new_child.set_parent(self, i +1)
self.keys.append(new_key)
self.pointers.append(new_child)
new_child.set_parent(self, n +1)
def fix_parent_pointers_for_children(self):
for (i, child_node) in enumerate(self.pointers) :
child_node.set_parent(self, j)
def _split_node(self):
assert len(self.keys)==2* self.d +1
n = len(self.keys)
d = self.d
mid_key = self.keys[d]
new_keys = list(self.keys[d +1:])
self.keys = list(self.keys[:d])
if self.is_leaf() :
new_ptrs =[]
else :
new_ptrs = list[self.pointers[d+1:]]
self.pointers =list[self.pointers[:d+1]]
new_node = self.create_new_instance(new_keys, new_ptrs, False, d)
new_node.fix_parent_pointers_for_children()
return (mid_key, self, new_node)
def handle_full_node(self):
assert len(self.keys)==2* self.d +1
d = self.d
if self.parent == None :
return self.split_node()
(parent_node, parent_idx)= self.parent
if self.right_sibling and len(self.right_sibling.keys)<2* self.d:
parent_index = self.parent.pointers.index(self)
self.parent.keys.insert(parent_index, self.keys.pop())
self.right_sibling.keys.insert(0, self.parent.keys[parent_index])
if not self.is_leaf():
fix_pointers_for_children(self, self.right_sibling)
return
elif self.left_sibling and len(self.left_sibling.keys)<2* self.d:
parent_index = self.parent.pointers.index(self)-1
self.parent.keys.insert(parent_index, self.keys.pop(0))
self.left_sibling.keys.append(self.parent.keys[parent_index])
if not self.is_leaf():
fix_pointers_for_children(self.left_sibling, self)
return
else:
self.split_node()
Cell In[77], line 108, in BTreeNodeWithInsert.handle_full_node(self)106 d = self.d 107 if self.parent == None : -->108 return self.split_node()110(parent_node, parent_idx)= self.parent 111 # Check if there is a right sibling and if it can lend a key 112 # Check if there is a right sibling and if it can lend a key AttributeError: 'BTreeNodeWithInsert' object has no attribute 'split_node'

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Programming Questions!