Вступ
У цьому виклику ваше завдання полягає в тому, щоб написати програму, яка вирішить, чи є два задані дерева ізоморфними. Дерево означає спрямований ациклічний графік, де кожен вузол має рівно один вихідний край, крім кореня, якого немає. Два дерева є ізоморфними, якщо одне можна перетворити на інше шляхом перейменування вузлів. Наприклад, два дерева (де кожен край вказує вгору)
0 0
/|\ /|\
1 3 4 1 2 5
|\ /|
2 5 3 4
їх легко помітити як ізоморфні.
Ми кодуємо дерево як список L
негативних цілих чисел наступним чином. Корінь дерева має мітку 0
, а також має вузли 1,2,...,length(L)
. Кожен вузол i > 0
має вихідний край до L[i]
(використовуючи індексацію на основі 1). Наприклад, список (з індексами, наведеними під елементами)
[0,0,1,3,2,2,5,0]
1 2 3 4 5 6 7 8
кодує дерево
0
/|\
1 2 8
| |\
3 5 6
| |
4 7
Вхідні дані
Ваші входи - це два списки неотримливих цілих чисел, наведені у рідному форматі чи вашій мові. Вони кодують два дерева способом, зазначеним вище. Ви можете взяти на себе такі умови:
- Вони не порожні.
- Вони мають однакову довжину.
- Кожен список
L
задовольняєL[i] < i
всім (на основі 1) індексамиi
.
Вихідні дані
Якщо результат дерев є ізоморфним, то вихідний результат має бути довірчою величиною, а якщо ні - хибною.
Правила та оцінка
Ви можете написати або повну програму, або функцію. Виграє найменший кількість байтів, а стандартні лазівки заборонені. Не існує обмежень у часі, але вбудовані модулі, які вирішують ізоморфізм дерева або графіка, заборонені.
Тестові кейси
Сутові екземпляри
[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]
Фальшиві екземпляри
[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]