Drzewo ze zbalansowanych nawiasów

0

Hej,
Mam następujący problem. Muszę policzyć wysokość drzewa, oraz najkrótszą ścieżke do liścia w drzewie zdefiniowanym jako nawiasy (lub utworzyć po prostu drzewo z tak zdefiniowanych nawiasów wtedy policzenie wysokości jest trywialne...)
Np takie nawiasy:
()()()() tworzą liste która ma wysokość 3.
Niby jest to w knuth'cie wytłumaczone wraz z przykładami (strona druga):
http://www.cs.utsa.edu/~wagner/knuth/fasc4a.pdf
oraz znalazłem niezły artykuł (Binary Trees, Forests, Non-Crossing Pairs):
https://sahandsaba.com/interview-question-generating-all-balanced-parentheses.html

Jednak nadal nie wiem jak utworzyć drzewo z tak zdefiniowanych nawiasów. W knuthcie oraz w tym artykule mam wrażenie że autorzy traktują to jako coś oczywistego. Nie wiem czy to ja czegoś nie widzę czy to nie jest takie proste. Czy wymagane jest stworzenie lasu a następnie drzwa binarnego?
Pozdrawiam

0

Tam w Knuthcie, jest: "The forest in (2) corresponds to the tree via natural correspondence discussed in Section 2.3.2" - Czyli tam jest opisany sposób transormacji wyrażenia w drzewo.

0

W przypadku drzewa binarnego, () () oznacza dodaj kolejny węzeł po prawej stronie, natomiast, ( ( ... dodaj kolejny węzeł po lewej stronie., ..) ), nie niesie informacji.

W przypadku lasu
( zacznij dodawać węzeł na wybranej głębokości,
(( zwiększ głębokość o 1, i dodaj węzeł.
) zakończ dodawani3 węzła i skończ lub przejdź do kolejnego na tej samej wysokości
)) zmniejsz głębokość o 1, i zakończ węzeł.

Na bardzie abstrakcyjnym poziomie,
( dodaj nowy węzeł pod aktualny rodzicem. Zmień rodzica na nowo stworzony węzeł.
) zmień aktualnego rodzica, na dziadka,( rodzica aktualnego rodzica)

1

Ogółem to przy pomocy stacka rozwiązałem problem. Prosty kod gdyby ktoś potrzebował:

class Node:

    def __init__(self):

        self.left = None
        self.right = None
        self.data = None

index = 0
def createBinaryTree(parentheses):
    global index
    if index >= len(parentheses) or parentheses[index] == ")":
        index = index + 1
        return None
    index = index + 1
    node = Node()
    node.left = createBinaryTree(parentheses)
    if index >= len(parentheses) or parentheses[index] == ")":
        index = index + 1
        return node
    node.right = createBinaryTree(parentheses)
    return node

def heightOfBST(bst):
    if bst == None:
        return 0
    else:
        return 1 + max(height_of_BST(bst.left), height_of_BST(bst.right))


if __name__ == "__main__":

    inputs = [
        "()()()()",
        "()()(())",
        "()(())()",
        "()(()())",
        "()((()))",
        "(())()()",
        "(())(())",
        "(()())()",
        "(()()())",
        "(()(()))",
        "((()))()",
        "((())())",
        "((()()))",
        "(((())))"
    ]
    for i in range(0, len(inputs)):
        index = 0
        bst = createBinaryTree(inputs[i])
        print(heightOfBST(bst))

1 użytkowników online, w tym zalogowanych: 0, gości: 1