J'ai été le codage un tas de différentes implémentations d'arbre de recherche binaire récemment (AVL, évasement, Treap) et je suis curieux de savoir s'il y a un choix particulièrement « bonne » façon d'écrire un itérateur pour traverser ces structures. La solution que je l'ai utilisé est en ce moment d'avoir chaque noeud dans les pointeurs de magasin de BST aux éléments suivants et précédents dans l'arborescence, ce qui réduit l'itération à une norme itération liste chaînée. Cependant, je ne suis pas vraiment satisfait de cette réponse. Il augmente l'utilisation de l'espace de chaque noeud par deux pointeurs (suivant et précédent), et dans un certain sens, il est tout simplement tricher.
Je connais un moyen de construire un iterator arbre de recherche binaire qui utilise O (h) espace de stockage auxiliaire (où h est la hauteur de l'arbre) à l'aide d'une pile pour garder une trace des nœuds frontières à explorer plus tard, mais je ai résisté à coder cette place en raison de l'utilisation de la mémoire. J'espérais il y a un moyen de construire un itérateur qui utilise uniquement l'espace constant.
Ma question est - est-il possible de concevoir un itérateur sur un arbre de recherche binaire avec les propriétés suivantes?
- Les éléments sont visités dans l'ordre croissant (soit un parcours infixe)
next()ethasNext()requêtes exécutées en O (1) heure.- Utilisation de la mémoire est O (1)
Pour le rendre plus facile, il est très bien si l'on suppose que la structure de l'arbre ne change pas de forme lors de l'itération (ie pas des insertions, des suppressions ou des rotations), mais ce serait vraiment cool s'il y avait une solution qui pourrait bien gérer cela.













