2015-11-25 2 views
1

Я питон новичку -.- Следующий код является то, что я пишу на leetcode:В чем причина того, что мне нужно использовать другое имя переменной для запуска моего кода?

def postorderTraversal(self, root): 
     """ 
     :type root: TreeNode 
     :rtype: List[int] 
     """ 
     result, stack, current, last_traversed = [], [], root, None 
     while stack or current: 
      if current: 
       stack.append(current) 
       current = current.left 
      else: 
       parent = stack[-1] 
       if parent.right in (None, last_traversed): 
        result.append(parent.val) 
        last_traversed = stack.pop() 
       else: 
        current = parent.right 
     return result 

Он работает, по-видимому, но я использовал, чтобы заменить все parent с current и программа дает мне результат " Превышен лимит времени ".

Что мне было интересно, почему я не могу просто использовать current на всем протяжении кода. Почему мне нужно создать другую переменную для родительского узла?

+2

Поскольку 'current' уже используется для другой роли, а одна переменная не может иметь двух значений? – interjay

+0

Но по крайней мере «current = current.right» работает для моего заказа и порядка заказа. – yantiz

+2

Я понятия не имею, о чем вы говорите в этом комментарии. Если вы напишете в 'current' вместо' parent', вы запишете значение, хранящееся в 'current', и, очевидно, получите неправильный результат в следующий раз, когда вам понадобится его исходное значение. – interjay

ответ

2

В отрасли, которая начинается с if parent.right, parent настроен, но current нет. Поэтому, если вы замените его на current, поведение изменится.

1

Если стек равен true, ток равен False, а стек [-1] .right - один из None и last_traversed, вы не хотите, чтобы текущий был изменен.

Это вопрос об алгоритме, а не о языке.

+0

Спасибо за ваш ответ, и да, это действительно вопрос с алгоритмом ... мой плохой. – yantiz