def poenostavi(d): '''poenostavi najbolj notranje operacije''' if je_stevilo(d): return d elif je_stevilo(d.levo) and je_stevilo(d.desno): return Drevo(vrednost(d)) else: return Drevo(d.podatek, levo=poenostavi(d.levo), desno=poenostavi(d.desno))
def drevesa_vmesni_premi(vmesni, premi): '''vrne množico vseh možnih dreves, ki jih lahko dobimo z premim in obratnim pregledom''' if len(premi) == 0: return {Drevo()} mnozica = set() koreni = [i for i in range(len(vmesni)) if vmesni[i] == premi[0]] for i in koreni: for levo in drevesa_vmesni_premi(vmesni[:i], premi[1:i+1]): for desno in drevesa_vmesni_premi(vmesni[i+1:],premi[i+1:]): mnozica.add(Drevo(premi[0], levo = levo, desno=desno)) return mnozica
def vstavi_v_iskalno_drevo(drevo, x): '''vstavi element v iskalno dvojiško drevo, drevo je še vedno iskalno''' if drevo.prazno: return Drevo(x) pod = drevo.podatek if x < pod: return Drevo(pod, levo=vstavi_v_iskalno_drevo(drevo.levo, x), desno=drevo.desno) elif x > pod: return Drevo(pod, levo=drevo.levo, desno=vstavi_v_iskalno_drevo(drevo.desno, x)) else: #sta enaka return drevo
def poisci_sobo(skladisce, pot, smer=None): '''Vrne iskano sobo ter skladišče s po potrebi dodanimi praznimi sobami.''' if skladisce.prazno: if smer == 'L': skladisce = Drevo(Vrsta()) elif smer == 'D': skladisce = Drevo(Sklad()) if pot == '': return skladisce, skladisce.podatek elif pot[0] == 'L': levo_skladisce, soba = poisci_sobo(skladisce.levo, pot[1:], smer='L') return Drevo(skladisce.podatek, levo=levo_skladisce, desno=skladisce.desno), soba elif pot[0] == 'D': desno_skladisce, soba = poisci_sobo(skladisce.desno, pot[1:], smer='D') return Drevo(skladisce.podatek, levo=skladisce.levo, desno=desno_skladisce), soba
def drevo_vmesni_nivojski(vmesni, nivojski): '''iz seznama vmesni in nivojski rekonstruira drevo''' if len(nivojski) == 0: return Drevo() podatek = nivojski[0] i = vmesni.index(podatek) desno_vmesni = vmesni[i+1:] levo_vmesni = vmesni[:i] drevo_levi = drevo_vmesni_nivojski(levo_vmesni,[t for t in nivojski if t in levo_vmesni]) drevo_desni = drevo_vmesni_nivojski(desno_vmesni,[t for t in nivojski if t in desno_vmesni]) drevo = Drevo(podatek, levo=drevo_levi, desno=drevo_desni) return drevo
def __init__(self, *args): self._elementi = Drevo() self._velikost = 0 if args: for element in args[0]: if not ali_vsebuje(self._elementi, element): self._elementi = vstavi_v_iskalno_drevo( self._elementi, element) self._velikost += 1
def stanko(narocila, porocilo): '''v datoteko porocilo zapise opozorila''' skladisce = Drevo(None) napake = [] for (oznaka, pot, kolicina) in preberi_narocila_iz_dat(narocila): try: skladisce = izvedi_narocilo(skladisce, oznaka, pot, kolicina) except IndexError: napake.append('Naročilo {}: V prostoru {} je premalo izdelkov'.format(oznaka, pot)) porocilo_zapisi(porocilo, napake, skladisce)
def drevo_vmesni_obratni(vmesni, obratni): '''iz seznama vmesni in obratni rekonstruira drevo''' if len(obratni) == 0: return Drevo() podatek = obratni[-1] i = vmesni.index(podatek) desno_vmesni = vmesni[i+1:] levo_vmesni = vmesni[:i] levi_obratni = obratni[:i] desni_obratni = obratni[i:-1] drevo_levi = drevo_vmesni_obratni(levo_vmesni,levi_obratni) drevo_desni = drevo_vmesni_obratni(desno_vmesni,desni_obratni) drevo = Drevo(podatek, levo=drevo_levi, desno=drevo_desni) return drevo
def drevo_vmesni_premi(vmesni, premi): '''iz seznama vmesni in premi rekonstruira drevo''' if len(premi) == 0: return Drevo() podatek = premi[0] i = vmesni.index(podatek) levo_vmesni = vmesni[:i] desno_vmesni = vmesni[i+1:] levi_premi = premi[1:i+1] desni_premi = premi[1+i:] drevo_levi = drevo_vmesni_premi(levo_vmesni,levi_premi) drevo_desni = drevo_vmesni_premi(desno_vmesni,desni_premi) drevo = Drevo(podatek, levo=drevo_levi, desno=drevo_desni) return drevo
def drevesa_premi_obratni(premi, obratni): '''vrne množico vseh možnih dreves, ki jih lahko dobimo z premim in obratnim pregledom''' if len(premi) == 0: return {Drevo()} elif len(premi) == 1: return {Drevo(premi[0])} podatek = premi[0] lk = obratni.index(premi[1]) mozna_prva_poddrevesa = drevesa_premi_obratni(premi[1:lk + 2], obratni[:lk + 1]) mnozica = set() if lk == len(obratni) - 2: for drevo in mozna_prva_poddrevesa: mnozica.add(Drevo(podatek, levo = drevo, desno = Drevo())) #prazno desno poddrevo mnozica.add(Drevo(podatek, levo = Drevo(), desno = drevo)) #prazno levo poddrevo else: mozna_leva = mozna_prva_poddrevesa mozna_desna = drevesa_premi_obratni(premi[lk+2:],obratni[lk + 1:-1]) for levo in mozna_leva: for desno in mozna_desna: mnozica.add(Drevo(premi[0], levo=levo, desno=desno)) return mnozica