Creazione di un elenco da un binario di ricerca albero

voti
4

Sto cercando di fare una lista di tutti gli elementi in un albero binario di ricerca. Capisco la ricorsione, ma non so come farlo tornare ogni valore e poi aggiungerla in un elenco. Voglio creare una funzione chiamata makeList()che restituirà un elenco di tutti gli articoli nel mio albero. Tutte le funzioni nei miei programmi funzionano tranne la makeList()funzione e sono inclusi per assicurarsi che tutti capiscano la struttura di base di come ho creato il mio albero.

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)

Guardando la mia makeList()funzione Posso capire perché non funziona, ma non so come farlo funzionare.

MODIFICARE

Ok ho capito! E ho anche avuto due risposte che sono:

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

e

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

E guardando indietro posso vedere che non capisco molto bene la ricorsione quindi è il momento di colpire i libri! Chiunque ha tutte le buone risorse sulla ricorsione?

Un'altra domanda, in modo da dire che io chiamo la mia makeList()funzione. Quando Python passa attraverso makeList(), quando si arriva al self.makeList(aNode.lChild, a)vuol riprenderà la funzione mentre è ancora finendo la makeList()funzione o si ferma tutto e semplicemente ricomincia con il suo nuovo aNode?

Spero che abbia un senso.

È pubblicato 05/04/2011 alle 02:09
fonte dall'utente
In altre lingue...                            


3 risposte

voti
1

inOrderstampa le cose, ma non restituisce nulla, quindi è inutile per la costruzione di una lista. Avete bisogno di un modo per tornare ogni nodo in ordine. Questo può essere qualcosa che la classe non è ancora coperto, ma controllare il yieldcomando.

Risposto il 05/04/2011 a 02:21
fonte dall'utente

voti
0

L'idea di base è qualcosa di simile:

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

Vedi come è essenzialmente la stessa cosa di inOrder?

Lei ha una struttura diversa nel programma che lo rende un po 'più difficile da implementare, ma l'idea di base è la stessa.

Risposto il 05/04/2011 a 02:43
fonte dall'utente

voti
1

Sei così vicino! MAKELIST può essere piuttosto semplice:

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

In sostanza, assicurarsi che non stai cercando di ricorsione ultimi nodi vuoti. Poi restituire l'elenco della struttura a sinistra, il nodo corrente, e la lista dei l'albero giusto.

Risposto il 05/04/2011 a 03:15
fonte dall'utente

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