représentent des arbres binaires de recherche en python

voix
5

Comment puis-je représenter des arbres binaires de recherche en python?

Créé 17/06/2010 à 04:19
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
11

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()

etc, etc - comme essentiellement dans une autre langue qui utilise des références plutôt que des pointeurs (tels que Java, C #, etc.).

Modifier :

Bien sûr, l'existence même de sillywalkest ridicule en effet, parce que la même fonctionnalité est un extrait externe roussir-liner au - dessus de la walkméthode:

for x in tree.walk(): print(x.payload)

et walkvous pouvez obtenir à peu près toute autre fonctionnalité sur les nœuds en ordre courant, alors que, avec sillywalk, vous pouvez obtenir à peu près diddly-squat. Mais, bon, l'OP dit yieldest « intimidant » (je me demande combien d'autres 30 mots - clés Python 2.6 méritent ces mots alarmistes dans le jugement de l'OP -) donc j'espère printn'est pas!

Tout cela est tout à fait au - delà de la question réelle, sur représentant BSTS: cette question est tout à fait répondu à la __init__- un payloadattribut pour maintenir la charge utile du noeud, leftet rightattribuer à tenir soit None( ce qui signifie, ce noeud n'a pas de descendants de ce côté) ou un Node( la partie supérieure du sous-arbre des descendants sur le côté approprié). Bien sûr, la contrainte de BST est que tous les descendants gauche de chaque noeud ( le cas échéant) a une charge utile inférieure ou égale à celle du nœud en question, chacun droit (encore une fois, le cas échéant) a une charge utile plus - j'ajouté insertjuste pour montrer comment il est trivial de maintenir cette contrainte, walk(et maintenantsillywalk) Pour montrer comment il est trivial d'obtenir tous les noeuds dans l'ordre croissant des charges utiles. Encore une fois, l'idée générale est juste identique à la façon dont vous souhaitez représenter un BST dans toutes les langues qui utilise des références plutôt que des pointeurs, comme, par exemple, C # et Java.

Créé 17/06/2010 à 04:26
source utilisateur

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