Quelles combinaisons de séquentialisation avant, après et dans l'ordre sont uniques?

28

Nous savons après la commande,

post L(x)     => [x]
post N(x,l,r) => (post l) ++ (post r) ++ [x]

et pré-commande

pre L(x)     => [x]
pre N(x,l,r) => [x] ++ (pre l) ++ (pre r)

et traversée dans l'ordre resp. séquentialisation.

in L(x)     => [x]
in N(x,l,r) => (in l) ++ [x] ++ (in r)

On peut facilement voir que ni l'un ni l'autre ne décrit un arbre donné de manière unique, même si nous supposons des clés / étiquettes distinctes deux à deux.

Quelles combinaisons des trois peuvent être utilisées à cette fin et lesquelles ne le peuvent pas?

Les réponses positives devraient inclure un algorithme (efficace) pour reconstruire l'arbre et une preuve (idée) pourquoi il est correct. Les réponses négatives devraient fournir des contre-exemples, c'est-à-dire différents arbres qui ont la même représentation.

Raphael
la source

Réponses:

16

Tout d'abord, je suppose que tous les éléments sont distincts. Aucune séquentialisation ne vous dira la forme d'un arbre avec des éléments [3,3,3,3,3]. Il est possible de reconstruire certains arbres avec des éléments en double, bien sûr; Je ne sais pas quelles sont les bonnes conditions suffisantes.

En continuant sur les résultats négatifs, vous ne pouvez pas reconstruire entièrement un arbre binaire à partir de ses séquentialisations pré-commande et post-commande uniquement. [1,2]précommande, [2,1]post-commande doit avoir 1à la racine, mais 2peut être l'enfant de gauche ou l'enfant de droite. Si vous ne vous souciez pas de cette ambiguïté, vous pouvez reconstruire l'arborescence avec l'algorithme suivant:

  • Soit le parcours de pré-commande et le parcours de post-ordre. Nous devons avoir , et c'est la racine de l'arbre.[x1,,xn][yn,,y1]x1=y1
  • x2 est l'enfant le plus à gauche de la racine et est l'enfant le plus à droite. Si , le nœud racine est unaire; récursivement sur et pour construire le sous-arbre unique.y2x2=y2[x2,,xn][yn,,y2]
  • Sinon, soit et les indices tels que et . est le parcours de pré-commande du sous-arbre gauche, celui du sous-arbre de droite, et de même pour les parcours post-ordre. Le sous arbre gauche a éléments, et le sous arbre droit a éléments. Reculez une fois pour chaque sous-arbre. Soit dit en passant, cette méthode se généralise aux arbres avec ramification arbitraire. Avec une ramification arbitraire, découvrez l'étendue du sous-arbre gauche et coupez ses éléments dans les deux listes, puis répétez pour couper le deuxième sous-arbre à partir de la gauche, etc.ijx2=yiy2=xj[x2,,xj1][xj,,xn]j2=ni+1i2=nj+1
    j2

Comme indiqué, le temps d'exécution est avec pire des cas (dans le cas de deux enfants, nous recherchons chaque liste de manière linéaire). Vous pouvez transformer cela en si vous prétraitez les listes pour construire une structure de carte finie des valeurs des éléments aux positions dans les listes d'entrée . Utilisez également un tableau ou une carte finie pour passer des indices aux valeurs; s'en tenir aux indices globaux, de sorte que les appels récursifs reçoivent toutes les cartes et prennent une plage comme argument pour savoir sur quoi agir.O(n2)Θ(n2)O(nlg(n))nlg(n)

Avec la traversée en précommande et la traversée en ordre , vous pouvez reconstruire l'arborescence comme suit:[x1,,xn][z1,,zn]

  • La racine est la tête du parcours de pré-commande .x1
  • Soit l'indice tel que . Alors est la traversée dans l'ordre de l'enfant gauche et est la traversée dans l'ordre de l'enfant droit. En fonction du nombre d'éléments, est la traversée en pré-commande de l'enfant gauche et celle de l'enfant droit. Recurse pour construire les sous-arbres gauche et droit.kzk=x1[z1,,zk1][zk+1,,zn][x2,,xk][xk+1,,xn]

Encore une fois, cet algorithme est comme indiqué, et peut être exécuté dans si la liste est prétraitée dans une carte finie des valeurs aux positions.O(n2)O(nlg(n))

La post-commande plus dans l'ordre est bien sûr symétrique.

Gilles 'SO- arrête d'être méchant'
la source
Y a-t-il une faute de frappe ici: "[1,2] précommande, [1,2] post-commande doit avoir 1 à la racine, mais 2 peut être soit l'enfant gauche soit l'enfant droit." L'ordre de publication d'une telle l'arbre serait [2,1] et non [1,2], que 2 soit un enfant gauche ou droit. De plus, voulez-vous dire que si à la fois des précommandes et des post-commandes sont données, nous ne pouvons pas reconstruire l'arbre, ou voulez-vous dire que si on ne nous en donne qu'une, nous ne pouvons pas reconstruire l'arbre?
CEGRD
@CEGRD En effet, la post-commande était une faute de frappe. L'exemple montre que vous ne pouvez pas reconstruire complètement l'arborescence dans ce cas: vous ne pouvez pas savoir s'il 2s'agit d'un enfant de gauche ou d'un enfant de droite. Cela correspond au cas du «sous-arbre unique» de l'algorithme de reconstruction.
Gilles 'SO- arrête d'être méchant'
comment cela change-t-il si nous savons qu'il s'agit d'un arbre de recherche binaire? pour le cas simple de votre exemple ([1,2] précommande, [2,1] post-commande), nous pourrions déterminer que la racine est 1 et que 2 est le bon enfant (car 2 est supérieur à 1) ... droite?
fersarr