Mise en œuvre d'un itérateur sur un arbre de recherche binaire

J'ai été le codage d'un tas de différents binaires de recherche arbres implémentations récemment (AVL, s'écartent, treap) et je suis curieux de savoir si il y a notamment un "bonne" façon d'écrire un itérateur pour parcourir ces structures. La solution que j'ai utilisé en ce moment, chaque nœud dans le BST stocker des pointeurs vers le suivant et précédent éléments dans l'arbre, ce qui réduit l'itération à une norme de liste liée itération. Cependant, je ne suis pas vraiment satisfait de cette réponse. Il augmente l'utilisation de l'espace de chaque nœud par deux pointeurs (précédent et suivant), et dans un certain sens, c'est juste de la triche.

Je sais que d'une façon de construire un arbre de recherche binaire itérateur qui utilise O(h) auxiliaire de l'espace de stockage (où h est la hauteur de l'arbre) à l'aide d'une pile de garder une trace de la frontière nœuds à explorer plus tard, mais j'ai résisté à ce codage a cause de l'utilisation de la mémoire. J'espérais qu'il y est une certaine façon de construire un itérateur qui n'utilise que la constante de l'espace.

Ma question est-ce - est-il possible de concevoir un itérateur sur un arbre de recherche binaire avec les propriétés suivantes?

  1. Éléments sont visités par ordre croissant (c'est à dire un afinde traversal)
  2. next() et hasNext() requêtes à exécuter en O(1) fois.
  3. L'utilisation de la mémoire est O(1)

Pour le rendre plus facile, c'est très bien si l'on suppose que la structure de l'arbre n'est pas le changement de forme au cours de l'itération (c'est à dire pas des insertions, des suppressions ou des rotations), mais ce serait vraiment cool si il y avait une solution qui pourrait gérer cela.

  • Si la traversée de l'arbre est mutable, vous pouvez utiliser une astuce de TAOCP I. 2.3.1 parcours d'arbres binaires, l'exercice 21. Il prend O(N) et O(1) de la mémoire. Lorsque l'algorithme termine l'arbre de parcours ne sera pas changé. Ce sera la même qu'avant.
  • C'est exactement la réponse que je cherche. 🙂
  • Pourquoi êtes-vous inquiet à propos de la surcharge de la mémoire de stockage d'une pile de nœuds de l'arborescence dans l'itérateur? C'est seulement O(log n) avec le nombre d'éléments dans l'arbre, si elle est bien équilibrée.
  • Je suis en train de maximiser l'asymptotique de la vitesse de copie. À l'aide d'une pile fait itérateur de la copie de O(lg n); j'ai espoir d'obtenir O(1) parce que le C++ itérateurs d'avoir copié et transmis autour d'un lot.
  • Henson, le code semble un peu buggé pour moi (je ne suis pas tout à fait sûr, cependant). Dans le BSTIterator<E> & opérateur++() la méthode à, la gauche, la descente doit être itératif, c'est à dire que vous avez à parcourir pour atteindre la gauche-est le nœud de m_curNode->GetRight().
  • Votre contribution ici ne permet pas de répondre à la question. Si vous souhaitez ajouter un commentaire, d'augmenter votre notoriété (stackoverflow.com/faq#reputation), si vous avez une question, n'hésitez pas à demander ici: stackoverflow.com/questions/ask