Δημιουργία μιας λίστας από μια δυαδική αναζήτηση Δέντρο

ψήφοι
4

Προσπαθώ να κάνω μια λίστα με όλα τα στοιχεία σε ένα δυαδικό δέντρο αναζήτησης. Κατανοώ την αναδρομή, αλλά δεν ξέρω πώς να το επιστρέψει κάθε αξία και στη συνέχεια να προσθέσετε το σε μια λίστα. Θέλω να δημιουργήσω μια λειτουργία που ονομάζεται makeList()η οποία θα επιστρέψει μια λίστα με όλα τα στοιχεία στο δέντρο μου. Όλες οι λειτουργίες στα προγράμματα μου εργάζονται εκτός από τη makeList()λειτουργία και συμπεριλαμβάνονται για να βεβαιωθείτε ότι ο καθένας καταλαβαίνει τη βασική δομή για το πώς μπορώ να ρυθμίσω το δέντρο μου.

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)

Κοιτάζοντας μου makeList()λειτουργία Μπορώ να καταλάβω γιατί δεν λειτουργεί, αλλά δεν ξέρω πώς να την κάνουμε να λειτουργήσει.

ΕΠΕΞΕΡΓΑΣΙΑ

Εντάξει, το κατάλαβα! Και εγώ ακόμα πήρα δύο απαντήσεις οι οποίες είναι:

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

και

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

Και κοιτάζοντας πίσω μπορώ να δω ότι δεν μπορώ να καταλάβω αναδρομή πολύ καλά και έτσι ήρθε η ώρα να χτυπήσει τα βιβλία! Όποιος έχει κάποια καλή πόρων αναδρομή;

Ένα άλλο θέμα, έτσι λένε καλώ μου makeList()λειτουργία. Όταν Python περνάει makeList(), όταν παίρνει να το self.makeList(aNode.lChild, a)κάνει αυτό αρχίσουν να τρέχουν τη λειτουργία και πάλι, ενώ είναι ακόμα τελειώνοντας τη makeList()λειτουργία ή έχει σταματήσει τα πάντα και αυτό ακριβώς ξεκινά πάνω με το είναι νέα aNode;

Ελπίζω ότι έχει νόημα.

Δημοσιεύθηκε 05/04/2011 στις 02:09
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
1

inOrderεκτυπώνει τα πράγματα, αλλά δεν επιστρέφει τίποτα, γι 'αυτό είναι άχρηστο για την οικοδόμηση ενός καταλόγου. Χρειάζεται έναν τρόπο να επιστρέψει κάθε κόμβο με τη σειρά. Αυτό μπορεί να είναι κάτι που την τάξη σας δεν έχει καλύψει ακόμα, αλλά δείτε την yieldεντολή.

Απαντήθηκε 05/04/2011 στις 02:21
πηγή χρήστη

ψήφοι
0

Η βασική ιδέα είναι κάπως έτσι:

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

Δείτε πώς είναι ουσιαστικά το ίδιο πράγμα με Inorder;

Έχετε μια διαφορετική δομή στο πρόγραμμά σας που το καθιστά λίγο πιο δύσκολο να εφαρμοστεί, αλλά η βασική ιδέα είναι η ίδια.

Απαντήθηκε 05/04/2011 στις 02:43
πηγή χρήστη

ψήφοι
1

Είσαι τόσο κοντά! makeList μπορεί να είναι αρκετά απλή:

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

Βασικά, βεβαιωθείτε ότι δεν προσπαθείτε να recurse παρελθόν άδειο κόμβους. Στη συνέχεια, επιστρέψτε τη λίστα στα αριστερά δέντρο, τον τρέχοντα κόμβο, και τον κατάλογο του δεξιού δένδρου.

Απαντήθηκε 05/04/2011 στις 03:15
πηγή χρήστη

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