Création d'une liste à partir d'un binaire Recherche Arbre

voix
4

Je suis en train de faire une liste de tous les éléments dans un arbre de recherche binaire. Je comprends la récursion , mais je ne sais pas comment le faire revenir chaque valeur et puis ajoutez dans une liste. Je veux créer une fonction appelée makeList()qui retourne une liste de tous les éléments de mon arbre. Toutes les fonctions de mes programmes fonctionnent , sauf la makeList()fonction et sont inclus pour vous assurer que tout le monde comprend la structure de base de la façon dont j'ai créé mon arbre.

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)

En regardant ma makeList()fonction , je ne vois pas pourquoi cela ne fonctionne pas , mais je ne sais pas comment le faire fonctionner.

MODIFIER

OK j'ai compris! Et j'ai même eu deux réponses qui sont:

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

et

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

Et en regardant en arrière, je vois que je ne comprends pas très bien récursion il est temps de frapper les livres! Quelqu'un at-il de bonnes ressources sur récursion?

Une autre question, donc dire que j'appelle ma makeList()fonction. Lorsque Python passe par makeList(), quand il arrive au - self.makeList(aNode.lChild, a)t - il commencer à courir à nouveau la fonction alors qu'il est encore terminé la makeList()fonction ou fait tout arrêter et il commence un peu plus avec son nouveau aNode?

J'espère que cela à du sens.

Créé 05/04/2011 à 02:09
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
1

inOrderimprime des choses , mais ne retourne rien, il est donc inutile pour la construction d' une liste. Vous avez besoin d' un moyen de retourner chaque nœud dans l' ordre. Cela peut être quelque chose que votre classe n'a pas encore couvert, mais il faut vérifier la yieldcommande.

Créé 05/04/2011 à 02:21
source utilisateur

voix
0

L'idée de base est quelque chose comme ceci:

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

Voyez comment il est essentiellement la même chose que afinde?

Vous avez une structure différente dans votre programme qui le rend un peu plus difficile à mettre en œuvre, mais l'idée de base est la même.

Créé 05/04/2011 à 02:43
source utilisateur

voix
1

Vous êtes si proche! makeList peut être assez simple:

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

En fait, assurez-vous que vous n'êtes pas essayer de récursivité derniers noeuds vides. Revenez ensuite la liste de l'arborescence de gauche, le nœud actuel, et la liste de l'arbre droit.

Créé 05/04/2011 à 03:15
source utilisateur

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