Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 11.12.2021
Сообщений: 18

Построение дерева по описанию

04.09.2024, 15:21. Показов 794. Ответов 1

Студворк — интернет-сервис помощи студентам
Существует дерево из n вершин, вершины пронумерованы от 1 до n, где из каждой вершины может выходить до 2х путей: левый и правый. Каждый путь - это путь в дочернюю вершину. У вершины может быть только левый, только правый, оба или ни одного.

Дерево обошли из вершины 1 (корень дерева) следующим способом:
Если в вершине есть левый путь, через которую ещё не ходили, то идут через него;
Иначе если в вершине есть правый путь, через который ещё не ходили, то идут через него;
Иначе возвращаются в предыдущую вершину, если она есть.

Вершины сохранили двумя списками. Первый список содержит номера вершин в порядке обхода, но только при первом попадании. Во второй список записывали вершину во время обхода, если:
Ещё не выписывали соответствующий номер и находимся в соответствующей вершине
Если в вершине есть левый путь, то через этот левый путь в этой вершине уже должны были пройти (если в вершине не было левого пути, то это условие игнорируется).

Требуется по этим спискам восстановить дерево, или если не существует ровно одного дерева, в котором ребята могли получить данные вам перестановки, начав обход дерева в вершине с номером 1, то выведите на единственной строке число -1.

Формат входных данных
На первой строке находится единственное число n (1<=n<=2*10^5) - количество вершин в дереве. На второй строке находится первый список из чисел от 1 до n. На третьей строке находятся второй список из чисел от 1 до n - второй список.

Формат выходных данных
Если не существует ровно одного дерева, в котором ребята могли получить данные вам перестановки, начав обход дерева в вершине с номером 1, то выведите на единственной строке число -1.

Если же такое дерево существует, то выведите n строк. На i-й строке должно находиться два числа xi и yi, означающие, что левая дверь из вершины i ведёт в вершину xi, а правая дверь ведёт в вершину yi. Если какая-то дверь в вершине отсутствует, то вместо соответствующего номера (xi или yi) выведите число 0.

Примеры
Входные данные
6
1 3 5 6 4 2
3 5 1 4 6 2
Выходные данные
3 6
0 0
0 5
0 0
0 0
4 2

Входные данные
2
2 1
1 2
Выходные данные
-1


Я решил эту задачу, однако я не знаю как реализовать проверку на то, что построение дерева единственное. Мой код:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
n = int(input())
f = list(map(int, input().split()))
s = list(map(int, input().split()))
 
pos_f = {v: i for i, v in enumerate(f)}
pos_s = {v: i for i, v in enumerate(s)}
 
l_ans = [0] * (n + 1)
r_ans = [0] * (n + 1)
 
stack = [f[0]]
 
for i in range(1, n):
    curr = f[i]
    prev = stack[-1]
 
    if pos_s[prev] > pos_s[curr]:
        l_ans[prev] = curr
    else:
        while stack and pos_s[stack[-1]] < pos_s[curr]:
            prev = stack.pop()
        r_ans[prev] = curr
 
    stack.append(curr)
 
if f[0] != 1:
    print(-1)
else:
    for i in range(1, n + 1):
        print(l_ans[i], r_ans[i])
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.09.2024, 15:21
Ответы с готовыми решениями:

Построение дерева
Окей, задача На первой строке подаётся число n кол-во &quot;объектов &quot; На следующих n строках подаются 3 числа x,y,v, где x,y - координаты...

Алгоритм Прима, построение максимального дерева
Как написать функцию для нахождения ребра с максимальным весом? import math def get_min(R, U): rm = (math.inf, -1, -1) ...

Построение остовного дерева
Есть прога с алгоритмом Прима, но выдает такие ошибки, как их исправить? k = int(input()) W = for i in range(k): W.append() ...

1
0 / 0 / 0
Регистрация: 04.09.2024
Сообщений: 6
04.09.2024, 18:07
Программа работает вроде нормально, но на каком-то 23 тесте (видимо слишком большом) падает. Скажите, а какие задачи из линейки B'-B вам удалось решить?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.09.2024, 18:07
Помогаю со студенческими работами здесь

Построение дерева значений из строки
Пишу шифр Хаффмана, мне необходимо считать таблицу с файла, чтобы затем построить из этого дерево , У меня есть файл 111a 01b ...

Некорректное построение обдуваемого ветром дерева Пифагора
Kлассическое, обнажённое и обнажённое обдуваемое ветром строятся как надо(судя по вики), а классическое обдуваемое ветром выходит криво....

Операции над бинарными деревьями: построение дерева, обход дерева, вставка и удаление элемента дерева
Пожалуйста кто сможет, помогите составить программу: Организация по трудоустройству населения сохраняет резюме клиентов в виде бинарного...

Построение схемы по её описанию
Помогите, пожалуйста, построить схему с указанием всех элементов по её описанию.

Построение бинарного дерева. Обход дерева
Построить дерево поиска с элементами – числами. С использованием операций Locate и DeleteLeft найти узел с заданным значением и исключить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru