You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何反转二叉树的队列循环中需要添加节点非空判断?

二叉树反转迭代法中if n判断的必要性

你尝试用队列迭代法实现二叉树反转,编写了如下代码:

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)

你原本认为while q条件成立时,取出的节点n必然不为空,if n是冗余代码,但移除后触发了NoneType错误,这里解释该判断的必要性:

  • 队列中会被加入空节点:当处理叶子节点时,它的left和right属性默认是None,执行q.append(n.left)和q.append(n.right)会把None添加到队列中。下一轮循环取出n就是None,如果没有if n判断,直接访问n.left或n.right会触发AttributeError。
  • 兼容空树场景:如果传入的root本身就是None,初始化队列时deque([root])会把None放入队列,第一次循环取出的n就是None,没有判断的话直接操作会报错。

这个if n判断的作用就是过滤队列中的空节点,避免对None进行属性访问操作,是代码正常运行的必要条件。

内容的提问来源于stack exchange,提问作者user35897

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 19:45:56