#python #algorithm #data-structures #tree
#python #алгоритм #структуры данных #дерево
Вопрос:
Учитывая двоичное дерево, соедините узлы, которые находятся на одном уровне. Вам будет предоставлен дополнительный указатель nextRight для того же.
Изначально все указатели nextRight указывают на значения мусора. Ваша функция должна установить эти указатели так, чтобы они указывали рядом справа для каждого узла.
10 10 ------> NULL
/ /
3 5 => 3 ------> 5 --------> NULL
/ /
4 1 2 4 --> 1 -----> 2 -------> NULL
Мой код:
def connect(root):
q = []
q.append(root)
while q:
x = len(q)
for i in range(x):
curr_node = q[0]
if i!=x-1:
curr_node.nextRight = q[1]
if curr_node.left:
q.append(curr_node.left)
if curr_node.right:
q.append(curr_node.right)
q.pop(0)
'''
:param root: root of the given tree
:return: none, just connect accordingly.
{
# Node Class:
class Node:
def __init__(self,val):
self.data = val
self.left = None
self.right = None
self.nextRight = None
}
Обратите внимание, что когда я использую while q
, я получаю превышение срока, а когда я использую while len(q)
, я получаю правильный ответ. Кто-нибудь может сказать мне причину, почему это так?
Комментарии:
1. Ваш код отлично работает для меня с обоими
while q:
иwhile len(q):
. Вы забываете указатьnextRight
None
, когдаi == x-1
. В нем говорится, чтоnextRight
это инициализируется мусором.2. Если вы хотите немного оптимизировать этот код, используйте коллекции. скорее, чем список. удаление первого элемента списка происходит медленно, но удаление из очереди оптимизировано для добавления и удаления с обоих концов.
3.
while q
иwhile len(q)
не должно иметь какой-либо заметной разницы во времени выполнения.4. Возможно, приведите какой-нибудь пример ввода с бенчмаркингом, чтобы показать разницу во времени? «На каком-то (неуказанном) веб-сайте истекает время ожидания, когда я вношу это изменение» недостаточно информации, чтобы определить, связана ли ошибка с вашим кодом или с веб-сайтом.