示例#1
0
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
示例#4
0
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
示例#7
0
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