2017-04-11 3 views
1

Considérons un arbre (non ordonnée) dans lequel les noeuds sont étiquetés de 0 à n, avec le noeud racine toujours marqué 0.arbre Réarrangez utilisant des étiquettes

Je souhaite construire un arbre séparé, dans lequel le parent de chaque non -noeud m est son ancêtre le plus proche avec un libellé inférieur à m.

Par exemple, étant donné cet arbre:

(0 (1 (3)) (5 (7 (9 4) 2 (6))) 8)

la puissance requise est:

(0 (1 (3) 5 (7 (9))) 4 2 (6) 8)

Notez que le nœud 2 a une étiquette inférieure à celle de son parent 5, il se déplace l'arbre le noeud 4 est inférieure à son parent 7 et son grand-parent 5 de sorte qu'il se déplace dans l'arbre pour son grand-parent 0.

L'approche naïve consiste à traiter chaque noeud indépendamment, traversant vers le haut jusqu'à ce que l'on rencontre une étiquette inférieure. Cela devient très coûteux pour des situations telles que:

(0 (n (n-1 ... (2 (1)))))

Il se sent comme il devrait y avoir un algorithme de sous-quadratique assez simple pour le traitement d'une telle réorganisation, mais je ne peux pas formuler le droit concoction ou même trouver un ordre traversal évident pour minimiser la quantité de traitement redondant. Est-ce un problème commun avec une solution bien définie?

Répondre

1

L'algorithme sera le suivant:

  1. REGLER 0 comme la racine d'un arbre
  2. effectuer DFS sur l'arbre d'origine.
  3. effectuer une injection récursive.

injection récursif (noeud, parent):

  1. si le noeud parent supérieur, injecter comme enfant du parent.
  2. injecter autrement récursif (nœud, parent.parent)
+1

Ah oui c'est le bon! Simple, trivial pour voir que cela fonctionne. Facile à faire une version itérative de la récursivité aussi. Merci @xenteros. – MorT

+1

@MorT il n'est pas nécessaire de remplacer récursion par un algorithme itératif. Vous pouvez avoir la même performance et un code plus clair. btw, sur [donc] nous upvote des réponses utiles et en outre accepter le meilleur :) – xenteros

+0

Hélas le problème tel que présenté ici est une édition largement élaguée d'un plus grand système. L'implémentation actuelle n'offre aucune garantie sur la profondeur de l'arbre, et l'intégration ne se prête pas à la récursion de queue. Merci pour le conseil sur l'étiquette;) – MorT