How can I continue entering values to my Binary Tree?

1

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.

    
asked by Johan Cancino 18.04.2017 в 03:32
source

0 answers