我试图反转一个二叉树(即交换所有左&右子级(
class Node(object):
def __init__(self, value=None, left=None, right=None):
self.value = value
self.left = left
self.right = right
def __repr__(self):
return f"Node({self.value}, {self.left}, {self.right})"
from collections import deque
def invert(root):
q=deque([root])
while q:
n=q.popleft() #n as in node
if n: #why do I need this
n.left,n.right=n.right,n.left
q.append(n.left)
q.append(n.right)
return root
root = Node(1, Node(2), Node(3))
invert(root)
我意识到,如果删除if n
,就会出现NoneType
错误。我在想,如果while q
为真,那么if n
将始终为真,所以if n
是多余的代码。
它是必需的。
首先,当树为空时需要它,因为q=deque([root])
将在队列上放置一个None
值,该值在循环中应该被忽略。
但当树不是空的时,也需要它:
当节点n
没有左右两个子节点时,q.append
调用中的一个(或两个(将在队列上附加一个None
值。因此,在循环的下一次迭代中,这个None
值将从队列中弹出。但在这种情况下,什么都不应该发生。
所以是的,if
是必需的。
您可以重新排列代码,但在某些地方您必须检测None
值。例如,以这个变体为例:
(注意:注释"n as in node">表示您应该将其命名为node
,而不是n
(
if not root:
return
queue = deque([root])
while queue:
node = queue.popleft()
node.left, node.right = node.right, node.left
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return root
这个版本避免了队列接收None
值,但这仍然意味着您需要if
——在本例中是其中的三个!