У меня возникла проблема во время одного из моих фиктивных интервью, где я должен был выяснить, как долго бинарное дерево полностью сгорит после того, как один данный узел уже горит.
"Бинарное дерево начинает гореть с листового узла. время (1 секунда на запись от узла к узлу), необходимое для получения всего дерева сожжен? Огонь распространится на все пути от узла. "
Скажем, у вас есть такое дерево, где N - это узел, который горит. Это происходит в первую секунду, где секунды s, поэтому в нулях s:
1
/ \
1 1
/ \ \
1 1 1
/ \ \
1 N 1
\
1
После того, как пройдет одна секунда, дерево будет обновлено с использованием более сожженных узлов. Пример следующей секунды (s + 1) будет таким:
1
/ \
1 1
/ \ \
1 N 1
/ \ \
1 N 1
\
1
Пример следующей секунды (s + 2) будет выглядеть так:
1
/ \
N 1
/ \ \
1 N 1
/ \ \
N N 1
\
1
Теперь на третьей секунде (s + 3) будет так:
N
/ \
N 1
/ \ \
N N 1
/ \ \
N N 1
\
1
При том же шаблоне дерево будет записано в (s + 7)
N
/ \
N N
/ \ \
N N N
/ \ \
N N N
\
N
Поняв немного, я провел небольшое исследование, чтобы выяснить, как это сделать. Я нашел эту классную статью article и продолжил ее и реализовал идею, лежащую в основе.
Мой подход состоял в том, чтобы найти диаметр и высоту дерева, чтобы найти самый дальний узел к узлу. Однако, когда я реализовал свои функции, я только получаю результат начального узла starting node до конца данного узла given node без проверки предыдущих родительских узлов. Вот моя реализация в Python 3:
# Tree class
class Node:
def __init__(self, key):
self.left = None
self.right = None
self.value = key
# Maximum height of a tree
def maxHeight(root):
if root is None:
return 0
else:
return 1 + max(maxHeight(root.left), maxHeight(root.right))
# Diameter of the tree
def maxDiameter(root):
how_long = 0
if root is None:
return 0
else:
root_diameter = maxHeight(root.left) + maxHeight(root.right)
left_diameter = maxDiameter(root.left)
right_diameter = maxDiameter(root.right)
how_long = max(max(left_diameter, right_diameter), root_diameter)
return how_long
# Sample code
root = Node(1)
root.left = Node(1)
root.right = Node(1)
root.left.left = Node(1)
root.left.right = Node(1)
root.left.right.left = Node(1)
root.left.right.right = Node(1)
root.right.right = Node(1)
root.right.right.right = Node(1)
root.right.right.right.right = Node(1)
print ("Starting from the given node, it will take %ds to burn the whole tree" % (maxDiameter(root.left.right)))
Ожидаемый вывод для этого примера должен быть 6 с (начиная с 0 с данного узла). Но опять же, я не получаю полный объем дерева. Насколько я понимаю, это должно работать со всеми делами. Итак, какой поиск будет полезен здесь, DFS или BFS? Думаю, это поможет мне найти решение, но опять же. Любые отзывы приветствуются :)