Πώς μπορώ να αντιπροσωπεύουν δυαδικά δέντρα αναζήτησης πύθωνα;
αντιπροσωπεύουν δυαδικά δέντρα αναζήτησης python
class Node(object):
def __init__(self, payload):
self.payload = payload
self.left = self.right = 0
# this concludes the "how to represent" asked in the question. Once you
# represent a BST tree like this, you can of course add a variety of
# methods to modify it, "walk" over it, and so forth, such as:
def insert(self, othernode):
"Insert Node `othernode` under Node `self`."
if self.payload <= othernode.payload:
if self.left: self.left.insert(othernode)
else: self.left = othernode
else:
if self.right: self.right.insert(othernode)
else: self.right = othernode
def inorderwalk(self):
"Yield this Node and all under it in increasing-payload order."
if self.left:
for x in self.left.inorderwalk(): yield x
yield self
if self.right:
for x in self.right.inorderwalk(): yield x
def sillywalk(self):
"Tiny, silly subset of `inorderwalk` functionality as requested."
if self.left:
self.left.sillywalk()
print(self.payload)
if self.right:
self.right.sillywalk()
κλπ, κλπ - ήθελα βασικά σε οποιαδήποτε άλλη γλώσσα που χρησιμοποιεί αναφορές και όχι δείκτες (όπως η Java, C #, κλπ).
Επεξεργασία :
Φυσικά, η ίδια η ύπαρξη της sillywalkείναι ανόητο, πράγματι, επειδή ακριβώς η ίδια λειτουργικότητα είναι τσουρουφλίζω-επένδυση εξωτερικής απόσπασμα στην κορυφή της walkμεθόδου:
for x in tree.walk(): print(x.payload)
και walkμπορείτε να αποκτήσετε ακριβώς για οποιαδήποτε άλλη λειτουργία στη ροή κόμβων-στην-τάξη, ενώ, με το sillywalk, μπορείτε να αποκτήσετε μόνο για diddly-squat. Αλλά, hey, το ΕΠ λέει yieldείναι «εκφοβισμού» (αναρωτιέμαι πόσοι από Python 2.6 για άλλες 30 λέξεις-κλειδιά αξίζουν τέτοιες λέξεις τρομάξει με την απόφαση του ΕΠ -;), έτσι ελπίζω printνα μην είναι!
Αυτό είναι εντελώς πέρα από το πραγματικό ερώτημα, σχετικά αντιπροσωπεύουν BSTs: ότι η ερώτηση έχει απαντηθεί πλήρως στο __init__- ένα payloadχαρακτηριστικό για να κρατήσει το ωφέλιμο φορτίο του κόμβου, leftκαι rightαποδίδουν για να κρατήσει είτε None(έννοια, αυτός ο κόμβος δεν έχει απογόνους σε αυτή την πλευρά) ή Node( η κορυφή του υπο-δέντρο των απογόνων από την κατάλληλη πλευρά). Φυσικά, ο περιορισμός BST είναι ότι κάθε αριστερό απόγονος του κάθε κόμβου (αν υπάρχει) έχει ωφέλιμο φορτίο μικρότερο ή ίσο από αυτό του κόμβου στο ερώτημα αυτό, κάθε σωστή (και πάλι, αν υπάρχει) έχει ένα μεγαλύτερο ωφέλιμο φορτίο - πρόσθεσα insertμόνο για να δείξει πόσο ασήμαντο είναι να διατηρηθεί αυτό το εμπόδιο, walk(και τώρα sillywalk) για να δείξει πόσο ασήμαντο είναι να πάρει όλους τους κόμβους σε αύξουσα σειρά ωφέλιμα φορτία. Και πάλι, η γενική ιδέα είναι ακριβώς όμοια με τον τρόπο που θα αντιπροσωπεύουν ένα BST σε οποιαδήποτε γλώσσα που χρησιμοποιεί αναφορές και όχι δείκτες, όπως, για παράδειγμα, C # και Java.













