Implementación en python de Arboles B. Nota: No esta implementada la función de eliminar
1 """
2 Funcionalidad: Implementación de Arboles B.
3 Autor(es): Diego Andrés Sanabria Martin (diegueus9) - Angelica María Juez Suárez (angelito)
4 Licencia: GPL v2.0
5 Fecha: Noviembre de 2005
6 """
7 # diegueus9 - angelito
8 class Arbol:
9 def __init__(self):
10 self.pagina=[]
11 self.hijos=[]
12 self.pad=None
13 def __repr__(self,nivel=0):
14 r=""
15 r=r+"Nivel : "+str(nivel)+" "+str(self.pagina)+"\n"
16 for i in range(len(self.hijos)):
17 r=r+self.hijos[i].__repr__(nivel+1)
18 return r
19 def insertar(self,dato,min,max,padre=None):
20 tmp=[]
21 # Guarda el supuesto puntero al padre
22 self.pad=padre
23 try:
24 self.pagina.index(dato)
25 return self
26 except:
27 # Si el arbol es nulo y no tiene nada
28 if len(self.pagina)==0:
29 self.pagina.append(dato)
30 # Si aun no se llenado la pagina
31 elif len(self.pagina)<max and self.pad==None and len(self.hijos)==0:
32 self.pagina.append(dato)
33 self.pagina.sort()
34 # Si no se llena la pagina pero hay hijos
35 elif len(self.pagina)<max and self.pad==None and len(self.hijos)!=0:
36 estaInsertado=False
37 for iterador in range(len(self.pagina)):
38 if dato<self.pagina[iterador] and not estaInsertado:
39 self.hijos[iterador].insertar(dato,min,max,self)
40 estaInsertado=True
41 if not estaInsertado:
42 self.hijos[iterador+1].insertar(dato,min,max,self)
43 # Si no se llena la pagina pero hay un padre y no hay hijos
44 elif len(self.pagina)<max and self.pad!=None and len(self.hijos)==0:
45 self.pagina.append(dato)
46 self.pagina.sort()
47 # Si no se llena la pagina y tengo un padre y unos hijos
48 elif len(self.pagina)<max and self.pad!=None and len(self.hijos)!=0:
49 estaInsertado=False
50 for iterador in range(len(self.pagina)):
51 if dato<self.pagina[iterador] and not estaInsertado:
52 self.hijos[iterador].insertar(dato,min,max,self)
53 estaInsertado=True
54 if not estaInsertado:
55 self.hijos[iterador+1].insertar(dato,min,max,self)
56 # Si la pagina ya esta llena y no tengo padre ni hijos
57 elif len(self.pagina)==max and self.pad==None and len(self.hijos)==0:
58 self.pagina.append(dato)
59 self.pagina.sort()
60 for i in range(max/2):
61 tmp.append(self.pagina.pop())
62 dato=self.pagina.pop()
63 self.pad=Arbol()
64 self.pad.insertararriba(dato,min,max)
65 self.pad.hijos.append(self)
66 arboltmp=Arbol()
67 for a in range(len(tmp)):
68 arboltmp.insertar(tmp.pop(),min,max,self.pad)
69 self.pad.hijos.append(arboltmp)
70 # Si la pagina ya esta llena pero tengo hijos
71 elif len(self.pagina)==max and self.pad==None and len(self.hijos)!=0:
72 estaInsertado=False
73 for iterador in range(len(self.pagina)):
74 if dato<self.pagina[iterador] and not estaInsertado:
75 self.hijos[iterador].insertar(dato,min,max,self)
76 estaInsertado=True
77 if not estaInsertado:
78 self.hijos[iterador+1].insertar(dato,min,max,self)
79 # Si la pagina esta llena no hay hijos pero si hay padre
80 elif len(self.pagina)==max and self.pad!=None and len(self.hijos)==0:
81 self.pagina.append(dato)
82 self.pagina.sort()
83 for i in range(max/2):
84 tmp.append(self.pagina.pop())
85 dato=self.pagina.pop()
86 arboltmp=Arbol()
87 for a in range(len(tmp)):
88 arboltmp.insertar(tmp.pop(),min,max,self.pad)
89 self.pad.hijos.append(arboltmp)
90 self.pad.ordenarHijos()
91 self.pad.insertararriba(dato,min,max)
92 # Si la pagina esta llena y no tiene padre pero si hijos
93 elif len(self.pagina)==max and self.pad!=None and len(self.hijos)!=0:
94 estaInsertado=False
95 for iterador in range(len(self.pagina)):
96 if dato<self.pagina[iterador] and not estaInsertado :
97 self.hijos[iterador].insertar(dato,min,max,self)
98 estaInsertado=True
99 if not estaInsertado:
100 self.hijos[iterador+1].insertar(dato,min,max,self)
101 return self.retornar()
102 def insertararriba(self,dato,min,max):
103 self.pagina.append(dato)
104 self.pagina.sort()
105 if len(self.pagina)>max:
106 tmppag=[]
107 tmphij=[]
108 if self.pad==None:
109 self.pad=Arbol()
110 self.pad.insertararriba(self.pagina.pop(max/2),min,max)
111 arb=Arbol()
112 for i in range(0,max/2):
113 tmppag.append(self.pagina.pop())
114 tmphij.append(self.hijos.pop())
115 tmphij.append(self.hijos.pop())
116 for a in range(0,len(tmppag)):
117 arb.insertar(tmppag.pop(),min,max,self.pad)
118 arb.hijos=tmphij
119 arb.ordenarHijos()
120 try:
121 self.pad.hijos.index(self)
122 except:
123 self.pad.hijos.append(self)
124 self.pad.hijos.append(arb)
125 self.retornar()
126 def mayor(self):
127 return self.pagina[len(self.pagina)-1]
128 def menor(self):
129 return self.pagina[0]
130 def ordenarHijos(self):
131 ultimo=len(self.hijos)-1
132 for i in range(0,len(self.hijos)+1):
133 for j in range(i+1,len(self.hijos)):
134 if self.hijos[i].mayor()>self.hijos[j].mayor():
135 tmp=self.hijos[i]
136 self.hijos[i]=self.hijos[j]
137 self.hijos[j]=tmp
138 def buscar(self, dato):
139 try:
140 self.pagina.index(dato)
141 print "El dato "+str(dato)+" ya esta en el arbol."
142 return True
143 except:
144 estaenArbol=False
145 for iterador in range(len(self.hijos)):
146 if dato<self.hijos[iterador].mayor() and not estaenArbol :
147 estaenArbol=self.hijos[iterador].buscar(dato)
148 return estaenArbol
149 def eliminar(self,dato,min,max):
150 pass
151 def retornar(self):
152 if self.pad!=None:
153 return self.pad.retornar()
154 else:
155 return self
156 class ArbolB:
157 def __init__(self, d):
158 self.dmax=2*d
159 self.dmin=d
160 self.raiz=Arbol()
161 def insertar(self,dato):
162 self.raiz=self.raiz.insertar(dato,self.dmin,self.dmax)
163 def __repr__(self):
164 return str(self.raiz)
