¿Son estos árboles isomorfos?

21

Introducción

En este desafío, su tarea es escribir un programa que decida si dos árboles dados son isomórficos. Un árbol significa un gráfico acíclico dirigido donde cada nodo tiene exactamente un borde saliente, excepto la raíz, que no tiene ninguno. Dos árboles son isomórficos si uno puede transformarse en otro cambiando el nombre de los nodos. Por ejemplo, los dos árboles (donde cada borde apunta hacia arriba)

  0       0
 /|\     /|\
1 3 4   1 2 5
|\       /|
2 5     3 4

son fácilmente vistos como isomorfos.

Codificamos un árbol como una lista Lde enteros no negativos de la siguiente manera. La raíz del árbol tiene etiqueta 0y también tiene nodos 1,2,...,length(L). Cada nodo i > 0tiene un borde saliente para L[i](usando indexación basada en 1). Por ejemplo, la lista (con los índices dados bajo los elementos)

[0,0,1,3,2,2,5,0]
 1 2 3 4 5 6 7 8

codifica el árbol

  0
 /|\
1 2 8
| |\
3 5 6
| |
4 7

Entrada

Sus entradas son dos listas de enteros no negativos, en formato nativo o en su idioma. Codifican dos árboles de la manera especificada anteriormente. Puede asumir las siguientes condiciones sobre ellos:

  1. No están vacíos
  2. Tienen la misma longitud.
  3. Cada lista Lsatisface L[i] < itodos los índices (basados ​​en 1) i.

Salida

Su salida será un valor verdadero si los árboles son isomorfos, y un valor falso si no.

Reglas y puntaje

Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten. No hay restricciones de tiempo, pero los incorporados que deciden el isomorfismo de árbol o gráfico no están permitidos.

Casos de prueba

Instancias de verdad

[0] [0]
[0,1,2,1] [0,1,1,3]
[0,1,1,3,3] [0,1,2,2,1]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,4,2,1]
[0,1,2,3,1,2,3,0,8] [0,1,0,3,3,4,4,7,7]

Instancias falsas

[0,0] [0,1]
[0,1,2,0,3,3,4] [0,1,2,3,0,4,3]
[0,1,0,1,2,3,3,0] [0,0,2,1,0,5,2,1]
[0,1,1,0,1,3,2,1,5] [0,1,0,3,3,3,2,5,2]
[0,1,2,3,1,2,3,0,8] [0,1,0,1,4,4,5,6,6]
[0,1,0,2,0,3,0,4,0,5] [0,0,2,1,0,3,4,0,0,9]
Zgarb
fuente
@DigitalTrauma Dangit, hiciste que el OP no permitiera las incorporaciones ... Tenía una solución Mma de 60 bytes ...
LegionMammal978

Respuestas:

2

Mathematica, 48 bytes

SameQ@@(Sort//@(0(0//.PositionIndex@#))&/@{##})&

Es incluso más corto que la solución que usa IsomorphicGraphQ:

IsomorphicGraphQ@@(Graph@*MapIndexed[#->Tr@#2&]/@{##})&
alephalpha
fuente
6

Python, 83

La función anónima en la segunda línea es mi solución.

f=lambda l,i=0:sorted(f(l,j+1)for j,e in enumerate(l)if e==i)
lambda a,b:f(a)==f(b)

fdevuelve una forma canonizada de un subárbol que es una lista ordenada de sus hijos canonizados. Luego, simplemente debemos verificar si las formas canonizadas de cada árbol son iguales.

caja de cartón
fuente