web-dev-qa-db-fra.com

Qu'est-ce qu'une implémentation d'arbre C ++ bonne et stable?

Je me demande si quelqu'un peut recommander une bonne implémentation d'arborescence C++, si tout va bien une compatible stl si possible.

Pour mémoire, j'ai écrit des algorithmes d'arbre plusieurs fois auparavant, et je sais que cela peut être amusant, mais je veux être pragmatique et paresseux si possible. Donc, un lien réel vers une solution de travail est l'objectif ici.

Remarque: je recherche un arbre générique, pas un arbre équilibré ou une carte/ensemble, la structure elle-même et la connectivité de l'arbre sont importantes dans ce cas, pas seulement les données à l'intérieur. Ainsi, chaque branche doit pouvoir contenir des quantités arbitraires de données, et chaque branche doit pouvoir être répétée séparément.

41
Robert Gould

Je ne connais pas vos besoins, mais ne seriez-vous pas mieux avec un graphique (implémentations par exemple dans Boost Graph ) si vous êtes principalement intéressé par la structure et pas tellement par l'arbre des avantages spécifiques comme la vitesse grâce à l'équilibrage? Vous pouvez `` émuler '' un arbre à travers un graphique, et peut-être qu'il sera (conceptuellement) plus proche de ce que vous recherchez.

23
Roel

Jetez un oeil à this .

La bibliothèque tree.hh pour C++ fournit une classe de conteneur de type STL pour les arbres n-aires, basée sur les données stockées aux nœuds. Différents types d'itérateurs sont fournis (post-commande, pré-commande et autres). Dans la mesure du possible, les méthodes d'accès sont compatibles avec la STL ou des algorithmes alternatifs sont disponibles.

HTH

19
MvdD

Je vais suggérer d'utiliser std :: map au lieu d'un arbre.

Les caractéristiques de complexité d'un arbre sont:

Insérer: O (ln (n))
Suppression: O (ln (n))
Trouver: O (ln (n))

Ce sont les mêmes caractéristiques que std :: map garantit.
.

7
Martin York

Ok les amis, j'ai trouvé une autre bibliothèque d'arbres; stlplus.ntree . Mais je ne l'ai pas encore essayé.

3
Robert Gould

Si vous n'avez pas de paires (clé, valeur), mais simplement des clés, utilisez std :: set. Cela utilise le même arbre rouge-noir que std :: map.

2
Denes Tarjan