Tworzenie listy z binarne drzewo poszukiwań

głosy
4

Próbuję zrobić listę wszystkich elementów w wyszukiwaniu binarnym drzewie. Rozumiem rekurencję, ale nie wiem jak zrobić to wrócić każdą wartość, a następnie dołączyć go do listy. Chcę utworzyć funkcję o nazwie makeList(), która zwraca listę wszystkich elementów w moim drzewie. Wszystkie funkcje działają w moich programach z wyjątkiem makeList()funkcji i są włączone, aby upewnić się każdy rozumie podstawową strukturę jak skonfigurować moje drzewo.

class Node(object):
    def __init__(self, data):
        self.data = data
        self.lChild = None
        self.rChild = None

class Tree(object):
    def __init__(self):
        self.root = None

    def __str__(self):
        current = self.root

    def isEmpty(self):
        if self.root == None:
            return True
        else:
            return False

    def insert (self, item):
        newNode = Node (item)
        current = self.root
        parent = self.root

        if self.root == None:
            self.root = newNode
        else:
            while current != None:
                parent = current
                if item < current.data:
                    current = current.lChild
                else:
                    current = current.rChild

            if item < parent.data:
                parent.lChild = newNode
            else:
                parent.rChild = newNode

    def inOrder(self, aNode):
        if aNode == None:
            pass
        if aNode != None:
            self.inOrder(aNode.lChild)
            print aNode.data
            self.inOrder(aNode.rChild)

    def makeList(self, aNode):
        a = []
        self.inOrder(aNode)
        a += [aNode.data]
        print a

n = Tree()
for i in [4,7,2,9,1]:
    n.insert(i)

n.makeList(n.root)

Patrząc na moje makeList()funkcji mogę zrozumieć, dlaczego to nie działa, ale nie wiem jak zrobić to działa.

EDYTOWAĆ

Ok, rozumiem! I nawet dostał dwie odpowiedzi, które są:

def makeList(self, aNode, a = []):
    if aNode != None:
        self.makeList(aNode.lChild, a)
        a += [aNode.data]
        self.makeList(aNode.rChild, a)
    return a

i

def makeList2(self, aNode):
    if aNode is None:
        return []
    return self.makeList2(aNode.lChild) + [aNode.data] + self.makeList2(aNode.rChild)

I patrząc wstecz widzę, że nie rozumiem rekursji bardzo dobrze, więc nadszedł czas, aby trafić na książki! Ktoś ma jakieś dobre środki na rekursji?

Inną kwestią, więc powiedzieć, że nazywają moją makeList()funkcję. Kiedy Python przechodzi makeList(), kiedy robi się do self.makeList(aNode.lChild, a)to zacząć ponownie uruchamiając funkcję, podczas gdy jest jeszcze kończąc się na makeList()funkcję lub nie wszystko zatrzymać i po prostu zaczyna się z nim nowegoaNode ?

Mam nadzieję, że to ma sens.

Utwórz 05/04/2011 o 02:09
źródło użytkownik
W innych językach...                            


3 odpowiedzi

głosy
1

inOrderwypisuje rzeczy, ale niczego nie wróci, więc jest bezużyteczny do budowy listy. Potrzebny jest sposób na powrót każdego węzła w porządku. Może to być coś, że klasa nie została jeszcze pokryta, ale zapoznać się z yieldpolecenia.

Odpowiedział 05/04/2011 o 02:21
źródło użytkownik

głosy
0

Podstawowa idea jest mniej więcej tak:

def makeList(self):
    return self.lChild.makeList() + [self.data] + self.rChild.makeList()

Zobacz, jak to jest w zasadzie takie samo jak Inorder?

Masz inną strukturę programu, który sprawia, że ​​jest to nieco trudniejsze do wykonania, ale podstawowa idea jest taka sama.

Odpowiedział 05/04/2011 o 02:43
źródło użytkownik

głosy
1

Jesteś tak blisko! makeList może być dość prosta:

def makeList(self, aNode):
    if aNode is None:
        # Stop recursing here
        return []
    return self.makeList(aNode.lChild) + [aNode.data] + self.makeList(aNode.rChild)

Zasadniczo, upewnij się, że nie próbujesz recurse przeszłości pustych węzłów. Następnie powrót do listy drzewie po lewej, bieżącego węzła i liście prawego drzewa.

Odpowiedział 05/04/2011 o 03:15
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more