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 2
peut ê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,…,xj−1][xj,…,xn]j−2=n−i+1i−2=n−j+1
j−2
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,…,zk−1][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.