Fork me on GitHub

Binární strom

    _15_  
   /    \ 
  8_    20
 /  \   /\
6   12 16 
/\  /\ /\ 
 7
/\

Vytvořte sadu funkcí (metod) pro práci s binárním stromem. Tedy: přidávání prvku, mazání prvku, hledání prvku, případně vyvažování stromu.

Jako základ pro vaši práci můžete použít tento zdrojový kód (Tento zdoj jsem použil, protože má hezký ASCII-art tisk).

class Uzel(object):
    def __init__(self, klic, rodic=None):
        self.klic = klic
        self.vlevo = None
        self.vpravo = None
        self.rodic = rodic


class Strom(object):
    def __init__(self):
        self.koren = None

    def vlozit(self, klic):
        if not self.koren:  # pokud je strom prázdný
            self.koren = Uzel(klic)
        else:
            hledacek = self.koren
            while True:
                if klic < hledacek.klic:
                    if hledacek.vlevo:  # vlevo něco je
                        hledacek = hledacek.vlevo
                    else:  # vlevo nic není
                        hledacek.vlevo = Uzel(klic)
                        hledacek.rodic = hledacek
                        break
                elif klic > hledacek.klic:
                    if hledacek.vpravo:  # vpravo něco je
                        hledacek = hledacek.vpravo
                    else:  # vpravo nic není
                        hledacek.vpravo = Uzel(klic)
                        hledacek.rodic = hledacek
                        break
                else:  # narazil jsem na číslo, které ve stromu už je
                    break

    def tisk(self):
        if self.koren is None:
            return '<empty tree>'

        def traverse(node):
            if node is None:
                return [], 0, 0  # lines | position | width
            label = str(node.klic)
            left_lines, left_pos, left_width = traverse(node.vlevo)
            right_lines, right_pos, right_width = traverse(node.vpravo)
            middle = max(right_pos + left_width - left_pos + 1, len(label), 2)
            pos = left_pos + middle // 2
            width = left_pos + middle + right_width - right_pos
            while len(left_lines) < len(right_lines):
                left_lines.append(' ' * left_width)
            while len(right_lines) < len(left_lines):
                right_lines.append(' ' * right_width)
            if (middle - len(label)) % 2 == 1 and node is not None:
                if node is node.vlevo:
                    if len(label) < middle:
                        label += b'_'
            label = label.center(middle, b'_')
            if label[0] == '_':
                label = ' ' + label[1:]
            if label[-1] == '_':
                label = label[:-1] + ' '
            lines = [' ' * left_pos + label + ' ' * (right_width - right_pos),
                    ' ' * left_pos + '/' + ' ' * (middle - 2) +
                    '\\' + ' ' * (right_width - right_pos)] + \
                    [left_line + ' ' * (width - left_width - right_width) +
                    right_line
                    for left_line, right_line in zip(left_lines, right_lines)]
            return lines, pos, width
        return '\n'.join(traverse(self.koren)[0])

if __name__ == '__main__':
    strom = Strom()
    strom.vlozit(7)
    strom.vlozit(16)
    strom.vlozit(12)
    strom.vlozit(9)
    strom.vlozit(1)
    print(strom.tisk())
Kategorie
TagCloud
#rekurze #OOP #začátečník #python #datové typy #hra #slovník #mírně pokročilý #středně pokročilý #podmínky a cykly #struktury a algoritmy #vstup/výstup #funkce #TkInter
Social