为什么我需要if节点在while队列之后反转二叉树



我试图反转一个二叉树(即交换所有左&右子级(

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——在本例中是其中的三个!

最新更新