Pré-commande + post-commande dans l'ordre

11

Tâche

Étant donné les traversées pré et post-ordre d'un arbre binaire complet, retournez sa traversée dans l'ordre.

Les traversées seront représentées sous la forme de deux listes, chacune contenant n entiers positifs distincts, chacun identifiant de manière unique un nœud. Votre programme peut prendre ces listes et produire la traversée dans l'ordre résultante, en utilisant n'importe quel format d'E / S raisonnable.

Vous pouvez supposer que l'entrée est valide (c'est-à-dire que les listes représentent en fait les traversées de certains arbres).

Il s'agit de , donc le code le plus court en octets l'emporte.

Définitions

Un arbre binaire complet est une structure finie de nœuds , représentée ici par des entiers positifs uniques.

Un arbre binaire complet est soit une feuille , constituée d'un seul nœud :

                                      1

Ou une branche , constituée d'un nœud avec deux sous-arbres (appelés sous-arbres gauche et droit ), chacun étant à son tour un arbre binaire complet:

                                      1
                                    /   \
                                  …       …

Voici un exemple complet d'arbre binaire complet:

                                        6
                                      /   \
                                    3       4
                                   / \     / \
                                  1   8   5   7
                                     / \
                                    2   9

La traversée en précommande d'un arbre binaire complet est définie de manière récursive comme suit:

  • La traversée en pré-commande d'une feuille contenant un nœud n est la liste [ n ].
  • La traversée en pré-commande d'une branche contenant un nœud n et des sous-arbres (L, R) est la liste [ n ] +  pré-commande ( L ) +  pré-commande ( R ), où + est l'opérateur de concaténation de liste.

Pour l'arbre ci-dessus, c'est [6, 3, 1, 8, 2, 9, 4, 5, 7] .


La traversée post-commande d'un arbre binaire complet est définie de manière récursive comme suit:

  • La traversée post-commande d'une feuille contenant un nœud n est la liste [ n ].
  • Le parcours postfixe d'une branche contenant un noeud n et des sous-arbres (L, R) est la liste postorder ( L ) +  postorder ( R ) + [ n ].

Pour l'arbre ci-dessus, c'est [1, 2, 9, 8, 3, 5, 7, 4, 6] .


La traversée dans l'ordre d'un arbre binaire complet est définie de manière récursive comme suit:

  • La traversée dans l'ordre d'une feuille contenant un nœud n est la liste [ n ].
  • La traversée dans l'ordre d'une branche contenant un nœud n et des sous-arbres (L, R) est la liste inorder ( L ) + [ n ] +  inorder ( R ).

Pour l'arbre ci-dessus, c'est [1, 3, 2, 8, 9, 6, 5, 4, 7] .


En conclusion: étant donné la paire de listes [6, 3, 1, 8, 2, 9, 4, 5, 7] (pré) et [1, 2, 9, 8, 3, 5, 7, 4, 6] (post) en entrée, votre programme devrait sortir [1, 3, 2, 8, 9, 6, 5, 4, 7] .

Cas de test

Chaque scénario de test est au format preorder, postorder → expected output.

[8], [8] → [8]
[3,4,5], [4,5,3] → [4,3,5]
[1,2,9,8,3], [9,8,2,3,1] → [9,2,8,1,3]
[7,8,10,11,12,2,3,4,5], [11,12,10,2,8,4,5,3,7] → [11,10,12,8,2,7,4,3,5]
[1,2,3,4,5,6,7,8,9], [5,6,4,7,3,8,2,9,1] → [5,4,6,3,7,2,8,1,9]
Lynn
la source
Puisque l'entrée est garantie d'avoir une forme spécifique (un arbre binaire complet), vous n'avez pas vraiment besoin des deux entrées, n'est-ce pas?
feersum
L'arbre binaire est plein , mais pas complet , donc un arbre à n éléments peut avoir plusieurs formes et, en général, vous avez besoin des deux.
Lynn
Puis-je représenter les nœuds comme des lettres simples donnant des chaînes pour les commandes. Par exemple, le deuxième exemple deviendrait "CDE" and "DEC" give "DCE":? (même en utilisant des lettres unicode si j'ai besoin de beaucoup de nœuds)
Ton Hospel
@TonHospel Je serais d'accord avec ça - sans doute, tout ce que vous faites est d'étirer un peu la définition d'une liste d'entiers , car ce "CDE"n'est pas très différent de [67, 68, 69]:)
Lynn

Réponses:

2

Perl, 69 66 62 56 53 octets

Comprend +1 pour -p

Prend la post-commande suivie de la précommande comme une ligne séparée par un espace sur STDIN (notez l'ordre de pré-publication et de post-publication). Les nœuds sont représentés comme des lettres uniques (tout caractère qui n'est ni espace ni nouvelle ligne est OK).

inpost.pl <<< "98231 12983"

inpost.pl:

#!/usr/bin/perl -p
s%(.)(.)+\K(.)(.+)\3(\1.*)\2%$4$5$3$2%&&redo;s;.+ ;;

L'utilisation du format purement numérique d'origine nécessite beaucoup plus de soin pour identifier exactement un seul numéro et se présente à 73 octets

#!/usr/bin/perl -p
s%\b(\d+)(,\d+)+\K,(\d+\b)(.+)\b\3,(\1\b.*)\2\b%$4$5,$3$2%&&redo;s;.+ ;;

Utilisé comme

inpostnum.pl <<< "11,12,10,2,8,4,5,3,7 7,8,10,11,12,2,3,4,5"
Ton Hospel
la source
-pajoute un ;à la fin, vous n'avez donc pas besoin du dernier ;. s;.* ;;->s;.* ;
Riley
@Riley je sais. Voilà pourquoi j'ai le ;à la fin. Mais -p ajoute en fait \n;à la fin d'un -eprogramme. Dans un fichier, il ajoute juste ;si et seulement si le fichier ne se termine pas \n. Puisque je veux réclamer -p+1 et non +3, le programme doit fonctionner à partir de la ligne de commande, donc avec -e. Et je ne veux pas la nouvelle ligne parasite dans la sortie que j'obtiendrais alors
Ton Hospel
Si vous l'exécutez sur la ligne de commande, n'en avez-vous pas besoin '? Si vous l'exécutez comme vous l'avez (appelez un fichier avec <<<), vous pouvez laisser le dernier ;hors tension.
Riley
@Riley Cela dépend de l'interprétation de la méthode de notation pour perl. Je soumets généralement mon code sous forme de fichier car je pense que c'est moins éphémère. Mais si vous regardez mes soumissions, vous verrez que si le code doit être dans un fichier (parce que par exemple il a 'ou utilise do$0etc.), je marque toujours -pcomme +3 (espace, moins, p), mais si le code fonctionnerait également sur la ligne de commande où vous obtenez le -eet le 'gratuitement, je le note +1car il peut être fourni avec lee
Ton Hospel
D'accord, je ne savais tout simplement pas exactement comment les soumissions en ligne de commande marquent. Je ne savais pas que vous obtenez 'gratuitement. Merci d'avoir clarifié cela.
Riley
3

Haskell, 84 83 octets

(a:b:c)#z|i<-1+length(fst$span(/=b)z),h<- \f->f i(b:c)#f i z=h take++a:h drop
a#_=a
dianne
la source
2

JavaScript (ES6), 100 octets

f=(s,t,l=t.search(s[1]))=>s[1]?f(s.slice(1,++l+1),t.slice(0,l))+s[0]+f(s.slice(l+1),t.slice(l)):s[0]

Les E / S sont des chaînes de caractères "sûrs" (par exemple des lettres ou des chiffres). Approche alternative, également 100 octets:

f=(s,t,a=0,b=0,c=s.length-1,l=t.search(s[a+1])-b)=>c?f(s,t,a+1,b,l)+s[a]+f(s,t,l+2+a,l+1,c-l-2):s[a]
Neil
la source