Question

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

Était-ce utile?

La solution

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 -. Essentiellement comme dans toute 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 sillywalk est ridicule en effet, parce que la même fonctionnalité est un extrait externe roussir-liner au-dessus de la méthode walk:

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

et walk vous 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 yield est « intimidante » (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 print est pas

Ceci est d'autant complètement au-delà de la question réelle, sur représentant BSTS: que La question est tout à fait répondu à la __init__ - un attribut payload pour maintenir la charge utile du noeud, left et attribut right à la main soit None (sens, 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'ai ajouté insert juste pour montrer comment il est trivial de maintenir cette contrainte, walk (et maintenant sillywalk) 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ésentent un BST dans toutes les langues qui utilise des références plutôt que des pointeurs, comme, par exemple, C # et Java.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top