Het creëren van een lijst van een binaire zoekboom

stemmen
4

Ik ben op zoek naar een lijst van alle items in een binaire zoekboom te maken. Ik begrijp de recursie, maar ik weet niet hoe je het elke waarde terugkeren en voeg vervolgens het in een lijst. Ik wil een functie genaamd creëren makeList()die een lijst van alle items zal terugkeren in mijn boom. Alle functies in mijn programma's werken met uitzondering van de makeList()functie en zijn opgenomen om ervoor te zorgen dat iedereen begrijpt de basisstructuur van de manier waarop ik mijn boom.

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)

Kijkend naar mijn makeList()functie kan ik zien waarom het niet werkt, maar ik weet niet hoe het te doen werken.

BEWERK

Oke, ik snap het! En ik kreeg zelfs twee antwoorden die zijn:

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

en

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

En terugkijkend kan ik zien dat ik niet recursie begrijp heel goed dus het is tijd om de boeken te raken! Iemand enig goede middelen op recursie?

Een andere vraag, zo zeg ik bel mijn makeList()functie. Wanneer Python gaat door makeList(), wanneer het aan het self.makeList(aNode.lChild, a)begint het uitvoeren van de functie opnieuw terwijl het nog steeds afwerking tot de makeList()functie of doet alles stoppen en het begint net iets meer dan met zijn nieuwe aNode?

Ik hoop dat zinvol is.

De vraag is gesteld op 05/04/2011 om 02:09
bron van user
In andere talen...                            


3 antwoorden

stemmen
1

inOrderdrukt dingen, maar geeft niets, dus het is nutteloos voor het bouwen van een lijst. Je moet een manier vinden om terug te keren elk knooppunt in orde is. Dit kan iets dat je klas nog niet is gedekt, maar bekijk de yieldopdracht.

antwoordde op 05/04/2011 om 02:21
bron van user

stemmen
0

Het basisidee is ongeveer als volgt:

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

Zie hoe het is in wezen hetzelfde als Inorder?

Je hebt een andere structuur in het programma dat maakt het een beetje moeilijker uit te voeren, maar het basisidee is hetzelfde.

antwoordde op 05/04/2011 om 02:43
bron van user

stemmen
1

Je bent zo dichtbij! MAKELIST kan vrij eenvoudig zijn:

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

Kortom, zorg ervoor dat je niet proberen om het verleden lege knooppunten recurse. Ga dan terug in de lijst van de linker boom, het huidige knooppunt, en de lijst van de juiste boom.

antwoordde op 05/04/2011 om 03:15
bron van user

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