Maison  >  Article  >  développement back-end  >  Comment pouvez-vous transformer efficacement une liste de chaînes de chemin en une structure arborescente hiérarchique sans dépendre fortement de la manipulation et de la récursivité des pointeurs ?

Comment pouvez-vous transformer efficacement une liste de chaînes de chemin en une structure arborescente hiérarchique sans dépendre fortement de la manipulation et de la récursivité des pointeurs ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-27 05:06:02282parcourir

How can you efficiently transform a list of path strings into a hierarchical tree structure without relying heavily on pointer manipulation and recursion?

Transformer les chaînes de chemin en structures arborescentes hiérarchiques

Lorsqu'on lui présente un tableau de structures de type chemin, la construction d'une structure arborescente hiérarchique correspondante peut être une tâche difficile, en particulier avec des limitations dans la manipulation et la récursivité du pointeur. Pour résoudre ce problème, une solution efficace consiste à utiliser une méthode qui ajoute de manière itérative des nœuds à l'arborescence tout en recherchant ceux qui existent.

SOLUTION

La solution proposée utilise une méthode récursive fonction nommée AddToTree qui prend une liste de nœuds (racine) et une liste de composants de chemin à ajouter (noms). Il parcourt les nœuds racine, vérifiant si le premier composant des noms (names[0]) existe déjà en tant qu'enfant. Si ce n'est pas le cas, un nouveau nœud avec noms[0] comme nom est ajouté à la racine.

Ensuite, la fonction appelle récursivement AddToTree sur les enfants du nœud qui correspond à noms[0]. Ce processus se poursuit jusqu'à ce que tous les composants des noms aient été traités, ce qui donne lieu à une structure arborescente entièrement construite.

EXEMPLE DE CODE

Vous trouverez ci-dessous l'implémentation Go de la fonction AddToTree :

<code class="go">func AddToTree(root []Node, names []string) []Node {
    if len(names) > 0 {
        var i int
        for i = 0; i < len(root); i++ {
            if root[i].Name == names[0] { //already in tree
                break
            }
        }
        if i == len(root) {
            root = append(root, Node{Name: names[0]})
        }
        root[i].Children = AddToTree(root[i].Children, names[1:])
    }
    return root
}</code>

EXEMPLE DE SORTIE

Grâce à cette solution, les données d'entrée fournies peuvent être transformées dans l'arborescence souhaitée :

[{
    "name": "a",
    "children": [{
        "name": "b",
        "children": [{
            "name": "c"
        }, {
            "name": "g"
        }]
    }, {
        "name": "d"
    }]
}]

DIFFÉRENCES CLÉS

Par rapport au code fourni, la solution proposée offre plusieurs avantages clés :

  • Elle fonctionne sur une liste de nœuds, permettant plusieurs nœuds racines.
  • Il crée de nouveaux nœuds au lieu de modifier le nœud d'entrée, évitant ainsi la duplication des données.
  • Il recherche activement dans l'arborescence pour éviter les nœuds en double.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn