Good, in this code implement a binary tree where values are entered and performing their respective operations. However, when wanting to enter more and more values, I am marked by an error that requires me to receive some advice on what can be done.
This is the code:
class Nodo:
def __init__(self,t):
self.hijos = list()
self.llaves = list()
self.hoja = 1
self.n = 0
for k in range (2*t):
self.llaves.append([None])
for k in range(2*t+1):
self.hijos.append([None])
class ArbolB:
def __init__(self, gradoMinimo):
self.t = gradoMinimo
self.raiz = None
def bTreeCreate(self):
if(self.raiz == None):
self.raiz = Nodo(self.t)
return self.raiz
def bTreeSplitShild(self, x, i):
z = Nodo(self.t)
y = x.hijos[i]
z.hoja = y.hoja
z.n = self.t-1
for j in range (1, self.t):
z.llaves[j] = y.llaves[j+self.t]
y.llaves[j+self.t] = None
if y.hoja == 0:
for j in range(1,self.t+1):
z.hijos[j] = y.hijos[j+self.t]
y.hijos[j+self.t] = None
y.n = self.t-1
for j in range(x.n+1, i,-1):
x.hijos[j+1] = x.hijos[j]
x.hijos[i+1]=z
for j in range(x.n,i-1,-1):
x.llaves [j+1] = x.llaves[j]
x.llaves[i] = y.llaves[self.t]
y.llaves[self.t] = None
x.n = x.n+1
def bTreeInsertNonFull(self, x, k):
i = x.n
if x.hoja == 1:
while (i >= 1) and (k < x.llaves[i]):
x.llaves[i+1] = x.llaves[i]
i = i-1
x.llaves[i+1]=k
x.n = x.n+1
else:
while (i >= 1) and (k < x.llaves[i]):
i = i-1
i=i+1
#leer disco
if (x.hijos[i].n == 2*self.t-1):
self.bTreeSplitShild(x,i)
if k > x.llaves[i]:
i = i+1
self.bTreeInsertNonFull(x.hijos[i], k)
def bTreeBuscar(self, x, k):
i = 1
while (i <= x.n) and (k > x.llaves[i]):
i = i+1
if (i <= x.n) and (k > x.llaves[i]):
return (x,i)
else:
if x.hoja == 1:
return None
else:
if (x.hijos[i].n == 2*self.t-1):
return self.bTreeBuscar(x.hijos[i], k)
def bTreeInsert(self, nodo, k):
r = self.raiz
if r.n == 2*self.t-1:
s = Nodo(self.t)
self.raiz = s
s.hoja = 0
s.n = 0
s.hijos[1] = r
self.bTreeSplitShild(s,1)
self.bTreeInsertNonFull(s,k)
else:
self.bTreeInsertNonFull(r,k)
def imprimeNodo(self, nodo):
for i in range (1, 2+self.t,1):
if(nodo.llaves[i] != None):
print (nodo.llaves[i])
class Controladora:
def main(self):
BT = ArbolB(2)
actual = BT.bTreeCreate()
print("Se insertara B")
BT.bTreeInsert(actual, ord("B"))
print("Se insertara T")
BT.bTreeInsert(actual, ord("T")) #84
print("Se insertara H")
BT.bTreeInsert(actual, ord("H"))
print("")
print("Imprime raiz")
BT.imprimeNodo(BT.raiz)
print("")
print("Se insertara M")
BT.bTreeInsert(actual, ord("M"))
print(BT.raiz.llaves)
print(BT.raiz.hijos[1].llaves)
print(BT.raiz.hijos[2].llaves)
print ("Se insertara O")
BT.bTreeInsert(actual, ord("O"))
print("Se insertara C")
BT.bTreeInsert(actual, ord("C"))
print(BT.raiz.llaves)
print(BT.raiz.hijos[1].llaves)
print(BT.raiz.hijos[2].llaves)
print ("Se insertara Z")
BT.bTreeInsert(actual, ord("Z"))
print(BT.raiz.llaves)
print(BT.raiz.hijos[1].llaves)
print(BT.raiz.hijos[2].llaves)
print(BT.raiz.hijos[3].llaves)
print ("Se insertara G")
BT.bTreeInsert(actual, ord("G"))
print(BT.raiz.llaves)
print(BT.raiz.hijos[1].llaves)
print(BT.raiz.hijos[2].llaves)
print(BT.raiz.hijos[3].llaves)
print ("Se insertara L")
BT.bTreeInsert(actual, ord("L"))
print(BT.raiz.llaves)
print(BT.raiz.hijos[1].llaves)
print(BT.raiz.hijos[2].llaves)
print(BT.raiz.hijos[3].llaves)
print ("Se insertara E")
BT.bTreeInsert(actual, ord("E"))
print(BT.raiz.llaves)
print(BT.raiz.hijos[1].llaves)
print(BT.raiz.hijos[2].llaves)
print(BT.raiz.hijos[3].llaves)
print(BT.raiz.hijos[4].llaves)
print ("Se insertara N")
BT.bTreeInsert(actual, ord("N"))
print ("Se insertara P")
BT.bTreeInsert(actual, ord("P"))
print ("Se insertara R")
BT.bTreeInsert(actual, ord("R"))
print(BT.raiz.llaves)
print(BT.raiz.hijos[1].llaves)
print(BT.raiz.hijos[2].llaves)
print(BT.raiz.hijos[3].llaves)
print(BT.raiz.hijos[4].llaves)
obj = Controladora()
obj.main()
And what happens is that I want to continue entering more values like the following:
print ("Se insertara P")
BT.bTreeInsert(actual, ord("P"))
But he does not leave me anymore and he shows me the following error:
AttributeError Traceback (most recent call last)
<ipython-input-21-b283e03bc71a> in <module>()
1 obj = Controladora()
----> 2 obj.main()
<ipython-input-20-d8944b5f8839> in main(self)
68 print(BT.raiz.hijos[1].llaves)
69 print(BT.raiz.hijos[2].llaves)
---> 70 print(BT.raiz.hijos[3].llaves)
71 print(BT.raiz.hijos[4].llaves)
72 print ("Se insertara P")
AttributeError: 'list' object has no attribute 'llaves'
Somebody could advise me please. No more to say thank you.