6
votes

Arbre :: Simple :: Traverse () ne visite pas la racine de l'arborescence - erreur ou fonctionnalité?

Si j'essaie le code suivant xxx

la sortie est xxx

montrant que la racine "A" n'est pas visitée. Ma compréhension de la traversée des arbres est que tous les nœuds devraient être visités. Suis-je tort ou y a-t-il des cas où il est logique de ne pas visiter la racine?

Annexe:

Tree :: Simple :: Traverse () est implémenté comme suit: xxx

pour le premier noeud (root) $ Func / $ post ne sont pas appelés, il n'y a donc aucune visite pour cela.

Si vous remplacez la traverse () avec xxx

Ça fonctionne comme je m'y attendais.


0 commentaires

3 Réponses :


1
votes

Vous avez raison. La racine doit être incluse dans un travertial d'arbre. Ceci est particulièrement clair si vous essayez une traversée d'inondation, car (en considérant que votre racine a deux enfants), la racine doit être entre deux enfants. Google ça, vous verrez le même comportement partout. J'ai même vérifié mon livre sur des algorithmes.

Je veillerais à avoir la version la plus récente du module et de le signaler comme une erreur.


4 commentaires

Je n'étais pas sûr si c'est une erreur parce que Arbre :: Simple est apparu à moi un module bien connu stable.


J'ai utilisé la version actuelle 1.18


Il y a des avantages à pouvoir ignorer le nœud du sujet, alors je suis en désaccord qu'il devrait également visiter le noeud de sujet.


Pourriez-vous donner un exemple quand il est nécessaire de sauter le nœud du sujet? Dans mon cas, je veux le nœud du sujet. Je dirais que s'il y a des deux cas, l'utilisateur devrait pouvoir choisir, quel comportement à utiliser.



3
votes

J'ai récemment utilisé l'arbre :: Paquet simple et je pense que le comportement observé est cohérent avec la documentation. Considérez, par exemple, la fonction «getDepth». Dans la documentation, il dit:

getDepth Retourne un nombre représentant la profondeur de l'invocant dans la Hiérarchie de l'arbre :: Objets simples.

Remarque: un arbre racine a la profondeur de -1. C'est parce que Arbre :: Simple suppose que la racine d'un arbre ne contiendra généralement pas de données, mais juste être une ancre pour les branches contenant des données. Cela peut ne pas être intuitif Dans tous les cas, je le mentionne ici.

De cela, il me semble que vous avez besoin et "ancrage" qui ne doit pas contenir de données. En d'autres termes, votre arbre devrait ressembler à ceci: xxx

puis, l'ancrage "sera de la profondeur -1," A "sera de la profondeur 0 et" B ' , 'c', 'd' sera de la profondeur 1.

espère que cela aide.


3 commentaires

Oui, l'ancrage sera désormais le nœud qui n'est pas visité, mais le noeud racine précédent (qui est censé être la racine) ne sera pas le prédicat «ISROOT» de retour. Ceci est un problème et le module est incompatible avec tout autre exemple de données de données d'arborescence. Ceci est également clair lorsque la profondeur d'un arbre racine est -1. Une profondeur est une distance, et donc, il ne peut pas être négatif.


Peut-il être résolu par la fixation de «Isroot», de retourner true sur le nœud qui contient 'A »?


Comment feriez-vous cela? Changez le module pour détecter la racine basée sur le parent du nœud de ne pas avoir de parent? Actuellement, il détecte si le nœud a un parent. Mais pourrait-il alors être possible pour un nœud racine d'avoir des frères et sœurs? Parce que c'est, actuellement, pas possible. Cela nécessitera une réécriture majeure du module de toute façon.



0
votes

Alors, je suis d'accord avec toutes les affiches ici, que cela peut être un peu déroutant. Toutefois, le module est bien établi et est actuellement utilisé dans un certain nombre de places / de codesbases, donc un changement de comportement radical, comme le change comment \ & traverse fonctionne n'est pas quelque chose que je pourrais divertir.

Cela dit, c'était mon point de vue à l'époque (et une sorte de nature est), qu'il existe une différence entre Traversal (mis en œuvre avec la méthode \ & Traverse) et la visite. Si vous jetez un coup d'œil sur le arbre :: Simple :: Visiteur Module, vous pourrez accomplir exactement ce que vous êtes après en définissant la méthode \ & INCLUMETUNK en conséquence. En outre, il existe un certain nombre d'autres implémentations de visiteurs dans ce module que vous pourriez trouver utiles.

Je vous encourage également à jeter un coup d'œil au module de forêt , qui est un moderne Réécrudez-vous de l'arbre :: simple qui utilise Moose . Il a aussi une méthode \ & traverse qui se comporte de cette manière, mais elle a également une méthode \ & fmap_cont qui est beaucoup plus puissante. De plus, Forest est en prise en charge des arbres immuables (pure) ainsi que des classes de lecteur / écrivain par défaut pour la sérialisation / désériorialiser vos arbres, indexer vos arbres, sérialisement JSON et plus.


0 commentaires