Un simple algorithme O (nlog (n)) cas-type découle d'attaquer le problème par l'approche de diviser pour régner. Commencer par input_level = 0
, output_level=0
, left=0
, right=n-1
.
Dans chacune des étapes récursives, compter les éléments ayant une valeur input_level+1
dans le tableau d'entrée A
dans la fourchette [left
, right
]. Ce sont les enfants du nœud actuel. S'il n'y a pas de tels éléments, imprimez output_level
et retournez. S'il n'y a qu'un seul élément de ce type, "supprimez" le nœud actuel (c'est-à-dire ne l'imprimez pas), augmentez left
de 1 et appelez la fonction récursivement. S'il existe deux ou plusieurs de ces éléments, imprimez output_level
, augmentez output_level
de 1 et appliquez la fonction récursivement à chacun des intervalles délimités par les éléments enfants. Toujours augmentez input_level
lors de l'appel récursif.
Pour l'entrée exemple A=[0, 1, 2, 3, 3, 1, 2, 3]
, d'abord l'algorithme trouverait des éléments à valeur 1, à des index 1 et 5. Ensuite, il imprimerait 0, augmenter output_level
et current_level
par 1 et lui-même appeler récursive deux fois: sur les plages [1 , 4] et [5, 7]. La complexité est O (n) dans le pire des cas (pour l'arbre dégénéré qui est en fait une liste), mais O (nlog (n)) en moyenne, comme un ary tree a une hauteur O (log (n)).
Qu'avez-vous essayé? Astuce: Pouvez-vous recréer l'arbre à partir de ces informations? –
Désolé, je n'ai pas compris ce que vous vouliez dire. Du tableau de sortie, il n'est pas possible de créer l'arbre d'entrée, mais ce n'est pas mon but de toute façon. Pourriez-vous expliquer plus s'il vous plaît? – guezara
L'exemple ne correspond pas à votre description. Vous supprimez les deux enfants du nœud 2 le plus à gauche. –