Opprette en liste fra et binært søketre

stemmer
4

Jeg prøver å lage en liste over alle elementer i et binært søketre. Jeg forstår rekursjon, men jeg vet ikke hvordan du gjør det tilbake hver verdi, og deretter legge den inn i en liste. Jeg ønsker å lage en funksjon som kalles makeList()som vil returnere en liste over alle elementene i min treet. Alle funksjonene i mine programmer fungerer unntatt makeList()funksjon og er inkludert for å sørge for at alle forstår den grunnleggende strukturen for hvordan jeg setter opp min treet.

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)

Ser på min makeList()funksjon jeg kan se hvorfor det ikke fungerer, men jeg vet ikke hvordan å gjøre det arbeidet.

REDIGERE

Ok jeg forstår! Og jeg fikk til og med to svar som er:

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

og

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

Og ser tilbake jeg kan se at jeg ikke forstår rekursjon veldig godt, så det er på tide å treffe bøkene! Alle som har noen gode ressurser på rekursjon?

Et annet spørsmål, så sier jeg ringe min makeList()funksjon. Når Python går gjennom makeList(), når det kommer til den self.makeList(aNode.lChild, a)ikke begynner det å kjøre funksjonen igjen mens den er fortsatt etterbehandling opp makeList()funksjon eller ikke alt stopper og det bare starter på nytt med det nye aNode?

Jeg håper det er fornuftig.

Publisert på 05/04/2011 klokken 01:09
kilden bruker
På andre språk...                            


3 svar

stemmer
1

inOrderskriver ting, men returnerer ikke noe, så det er ubrukelig for å bygge en liste. Du trenger en måte å komme tilbake hver node i orden. Dette kan være noe som din klasse ikke har dekket ennå, men sjekk ut yieldkommandoen.

Svarte 05/04/2011 kl. 01:21
kilden bruker

stemmer
0

Den grunnleggende ideen er noe sånt som dette:

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

Se hvordan det er i hovedsak det samme som inorder?

Du har en annen struktur i programmet som gjør det litt vanskeligere å gjennomføre, men den grunnleggende ideen er den samme.

Svarte 05/04/2011 kl. 01:43
kilden bruker

stemmer
1

Du er så nær! makeList kan være ganske enkel:

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

I utgangspunktet, sørg for at du ikke prøver å recurse siste tomme noder. Så tilbake på listen over venstre treet, gjeldende node, og listen over høyre treet.

Svarte 05/04/2011 kl. 02:15
kilden bruker

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