#algorithm #data-structures #binary-tree
#алгоритм #структуры данных #двоичное дерево
Вопрос:
Я должен создать алгоритм, чтобы найти самый длинный путь четного значения в двоичном дереве без использования рекурсии. Например, если мое дерево выглядит следующим образом: Двоичное дерево
Алгоритм должен возвращать 3
, поскольку это длина самого длинного пути только с четным значением.
Требования:
- У нас есть две очереди, которые мы можем использовать
- Путь должен начинаться с корня (который нам дан)
Что я имею в виду на данный момент:
- Используется
Morris Traversal
для перехода по дереву, но я не знаю, в какой части кода выполнять часть «поиск по пути» - Каким-то образом используйте очереди для сохранения соответствующих узлов,
q1
чтобы представлятьtempLongestPath
и другой, которыйoverallLongestPath.
Но у меня нет четкого представления о том, как сохранить длину пути при переходе по дереву.
Заранее спасибо за помощь!
Комментарии:
1. разве ответ не должен быть 4 (4->8->2->10->4)
2. Нет, поскольку он должен быть из корня (который нам дан), приношу свои извинения за то, что не добавил это к вопросу.
3. Для обхода Морриса вам необходимо изменить дерево, которое может нарушить путь решения.
Ответ №1:
Запустите BFS, представьте, что в дереве есть только четные значения, и отслеживайте длину.
Псевдокод:
queue.put(root)
L[root] = 1
Max_L = -1
while !Queue.empty():
current = queue.pull()
if (current %2 ==1): SKIP/CONTINUE
if Max_L < L[current]:
Max_L = L[current]
if current.left:
queue.put(current.left)
L[current.left] = L[current] 1
if current.right:
queue.put(current.right)
L[current.right] = L[current] 1
return Max_L
Если вы не хотите использовать массив или что-то разумное (например, словарь) для хранения длин, вы можете использовать вторую очередь для их отслеживания (вместо присвоения L выполняйте put вместо присваивания L и выполняйте pull при извлечении из queue
)
Комментарии:
1. Прежде всего, спасибо, что нашли время для ответа; Я ценю это. Я просто хотел уточнить, что
L
относится к и к чемуMax_L
относится.2.
L
это то, что мы используем для хранения длины четного пути для каждого узла.Max_L
максимальная длина, которую алгоритм собирается вернуть.3. Предполагая, что мы хотим использовать
queue
для хранения длины пути, какие изменения будут внесены в псевдокод? Одним из ограничений является то, что мне нужно использоватьconstant memory,
, и я думаюL
, что решение сделало бы его динамической памятью. Как бы работала эта часть, если бы это былqueue
:if Max_L < L[current]:
4. вы можете использовать вторую очередь вместо
L
сохранения текущей длины. Например, вместоL[root] = 1
того, чтобы вы можете писатьqueue_L.put(1)
, а вместо использованияL[current]
вы можете делатьcurrent_len = queue_L.pull()
, а затем использоватьcurrent_len
для сравнения, напримерif Max_L < current_len:
, при обновленииL[current.left] = L[current] 1
, которое вы можете делатьqueue_L.put(current_len 1)
.5. и что заставило вас думать, что очередь не требует динамической памяти?