Crearea unei liste de la un copac binar de căutare

voturi
4

Am încercat să fac o listă cu toate elementele dintr - un arbore binar de căutare. Înțeleg recurență , dar nu știu cum să facă returna fiecare valoare și apoi adăugați - l într - o listă. Vreau să creați o funcție numită , makeList()care va returna o listă a tuturor elementelor din copacul meu. Toate funcțiile din programele mele de lucru , cu excepția makeList()funcției și sunt incluse pentru a vă asigura că toată lumea înțelege structura de bază a modului în care am creat copacul meu.

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)

Privind la meu makeList()funcția pot să văd de ce nu funcționează , dar eu nu știu cum să facă să funcționeze.

EDITAȚI | ×

OK am luat-o! Și am primit chiar două răspunsuri, care sunt:

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 se uită înapoi pot vedea că eu nu înțeleg de recurență foarte bine asa ca e timpul pentru a lovi cărți! Oricine are nici resurse bune pe recursivitate?

O altă întrebare, spun așa că chemarea mea makeList()funcție. Când Python trece prin makeList(), atunci când se ajunge la self.makeList(aNode.lChild, a)nu - l începe să ruleze din nou funcția în timp ce este încă finalizat până makeList()funcția sau nu totul opri și tocmai începe peste cu ea e nou aNode?

Sper că are sens.

Întrebat 05/04/2011 la 02:09
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
1

inOrderimprimă lucruri , dar nu se întoarce nimic, deci este inutil pentru construirea unei liste. Ai nevoie de o modalitate de a reveni fiecare nod în ordine. Acest lucru poate fi ceva care clasa ta nu a acoperit încă, dar a verifica afară de yieldcomanda.

Publicat 05/04/2011 la 02:21
sursa de către utilizator

voturi
0

Ideea de bază este ceva de genul:

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

A se vedea modul în care aceasta este în esență același lucru ca și Inorder?

Ai o structură diferită în programul pe care o face un pic mai greu de implementat, dar ideea de bază este același.

Publicat 05/04/2011 la 02:43
sursa de către utilizator

voturi
1

Ești atât de aproape! makeList poate fi destul de simplu:

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

Practic, asigurați-vă că nu încerci să recurse noduri goale din trecut. Apoi a reveni lista de copac din stânga, nodul curent, precum și lista de copac dreapta.

Publicat 05/04/2011 la 03:15
sursa de către utilizator

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