Erstellen eine Liste von einem binären Suchbaum

stimmen
4

Ich versuche , eine Liste aller Elemente in einem binären Suchbaum zu machen. Ich verstehe die Rekursion , aber ich weiß nicht , wie es machen jeden Wert zurückgeben und sie dann in eine Liste anhängen. Ich möchte eine Funktion erstellen genannt , makeList()die eine Liste aller Elemente in meinem Baum zurück. Alle Funktionen in meinen Programmen arbeiten mit Ausnahme der makeList()Funktion und sind eingeschlossen , um sicherzustellen , dass jeder versteht die Grundstruktur , wie ich meinen Baum.

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)

Ein Blick auf meine makeList()Funktion kann ich sehen , warum es nicht funktioniert , aber ich weiß nicht , wie es funktioniert.

BEARBEITEN

OK ich habe es! Und ich habe auch zwei Antworten, die sind:

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

und

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

Und im Rückblick kann ich sehen, dass ich nicht verstehe, Rekursion sehr gut, so ist es Zeit, die Bücher zu schlagen! Wer noch keine gute Ressourcen auf Rekursion?

Eine andere Frage, so sage ich meine nennen makeList()Funktion. Wenn Python durchgeht makeList(), wenn es um die bekommt self.makeList(aNode.lChild, a)beginnt wieder die Funktion ausgeführt wird, während es noch ist die Finishing - makeList()Funktion oder stoppt alles und es beginnt etwas mehr als mit ihm ist neu aNode?

Ich hoffe das ergibt Sinn.

Veröffentlicht am 05/04/2011 um 02:09
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
1

inOrderdruckt Dinge aber nicht wieder etwas, so dass es für den Aufbau einer Liste nutzlos. Sie müssen einen Weg zurückkehren jeden Knoten um. Dies kann etwas sein , das Ihre Klasse noch nicht abgedeckt ist, aber die Besuche yieldBefehl.

Beantwortet am 05/04/2011 um 02:21
quelle vom benutzer

stimmen
0

Die Grundidee ist so etwas wie diese:

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

Sehen Sie, wie es im Wesentlichen dasselbe wie inOrder ist?

Sie haben eine andere Struktur in Ihrem Programm, das es ein bisschen schwieriger zu implementieren macht, aber die Grundidee ist das gleiche.

Beantwortet am 05/04/2011 um 02:43
quelle vom benutzer

stimmen
1

Du bist so nah! makelist kann ziemlich einfach sein:

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

Grundsätzlich sicherstellen, dass Sie nicht in der Vergangenheit leer Knoten zu rekursiv versuchen. Dann kehrt die Liste des linken Baumes, der aktuellen Knoten, und die Liste des richtigen Baumes.

Beantwortet am 05/04/2011 um 03:15
quelle vom benutzer

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