Este código usa a los aboles binarios como monticulos de prioridad.

   1 """
   2 Este código es propiedad de Diego Andrés Sanabria y es liberado bajo licencia GPL v2.0
   3 """
   4 class Arbol:
   5     clave=None
   6     izq=None
   7     der=None
   8     raiz=None
   9     def __init__(self,niv=0):
  10         self.niv=niv
  11     def __actNiv__(self,niv=0):
  12         self.niv=niv
  13         if self.izq:
  14             self.izq.__actNiv__(self.niv+1)
  15         if self.der:
  16             self.der.__actNiv__(self.niv+1)
  17     def __tab__(self,n):
  18         a=""
  19         for i in range(n):
  20             a=a+"\t"
  21         return a
  22     def __repr__(self):
  23         a=""
  24         a=a+str(self.clave)+"\n"
  25         if self.izq!=None:
  26             a=a+self.__tab__(self.izq.niv)+"Izq:"
  27             a=a+str(self.izq)+"\n"
  28         if self.der!=None:
  29             a=a+self.__tab__(self.der.niv)+"Der:"
  30             a=a+str(self.der)
  31         return a
  32     def ordenar(self):
  33         if self.raiz!=None:
  34             if self.clave>self.raiz.clave:
  35                 tmp=self.raiz.clave
  36                 self.raiz.clave=self.clave
  37                 self.clave=tmp
  38                 self.raiz.ordenar()
  39     def ordenarabajo(self,dato):
  40         if self.izq!=None and self.der!=None:
  41             if self.izq.clave>self.der.clave:
  42                 self.clave=self.izq.clave
  43                 self.izq.ordenarabajo(dato)
  44             else:
  45                 self.clave=self.der.clave
  46                 self.der.ordenarabajo(dato)
  47         elif self.izq!=None and self.der==None:
  48             self.clave=self.izq.clave
  49             self.izq.ordenarabajo(dato)
  50         elif self.izq==None and self.der==None:
  51             self.clave=dato
  52 class Monticulo:
  53     def __init__(self):
  54         self.abierto=[]
  55         self.cerrado=[]
  56         self.arbol=Arbol()
  57         self.datotmp=None
  58     def insertar(self,dato):
  59         if self.arbol.clave==None:
  60             self.arbol.clave=dato
  61         else:
  62             self.abierto.append(self.arbol)
  63             while len(self.abierto)!=0:
  64                 tmp=self.abierto.pop(0)
  65                 try:
  66                     self.cerrado.index(tmp)
  67                 except:
  68                     self.cerrado.append(tmp)
  69                     if tmp.izq!=None:
  70                         self.abierto.append(tmp.izq)
  71                     else:
  72                         tmp.izq=Arbol()
  73                         tmp.izq.clave=dato
  74                         tmp.izq.raiz=tmp
  75                         tmp.izq.ordenar()
  76                         break
  77                     if tmp.der!=None:
  78                         self.abierto.append(tmp.der)
  79                     else:
  80                         tmp.der=Arbol()
  81                         tmp.der.clave=dato
  82                         tmp.der.raiz=tmp
  83                         tmp.der.ordenar()
  84                         break
  85             self.abierto=[]
  86             self.cerrado=[]
  87         self.arbol.__actNiv__()
  88     def atender(self):
  89         if self.arbol.clave!=None:
  90             self.abierto.append(self.arbol)
  91             while len(self.abierto)!=0:
  92                 tmp=self.abierto.pop(0)
  93                 try:
  94                     self.cerrado.index(tmp)
  95                 except:
  96                     self.cerrado.append(tmp)
  97                     if tmp.izq!=None:
  98                         self.abierto.append(tmp.izq)
  99                     if tmp.der!=None:
 100                         self.abierto.append(tmp.der)
 101             ult=self.cerrado.pop()
 102             pult=ult.raiz
 103             if pult.izq!=None and pult.der!=None:
 104                 self.datotmp=pult.der.clave
 105                 pult.der=None
 106                 self.arbol.ordenarabajo(self.datotmp)
 107             elif pult.izq!=None and pult.der==None:
 108                 self.datotmp=pult.izq.clave
 109                 pult.izq=None
 110                 self.arbol.ordenarabajo(self.datotmp)
 111             ult=None
 112         self.abierto=[]
 113         self.cerrado=[]
 114         self.arbol.__actNiv__()

Python/Code/ArbolMonticulo (last edited 2010-09-20 20:39:11 by Kmilo)