反转二叉树遇NoneType错误:非空判断仍报错原因咨询
二叉树反转代码中的NoneType错误分析
问题代码
#code taken from leetcode so treenode is predefined # Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right class Solution: def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]: temp=root def dfs(node): if node: left_temp=node.left node.left=node.right node.right=left_temp if node.left: #Keeping a check only if left node is not None then proceed dfs(node.left) if node.right: #Keeping a check only if right node is not None then proceed dfs(node.right) dfs(temp) return root
问题描述
- 报错信息:访问
node.left时出现错误:NoneType对象没有left属性。 - 疑惑:按照Python规则,
None是假值,node.left为None时应该不会执行后续逻辑,想了解当前写法为何出错,问题出在哪里。
错误原因分析
问题核心是当node本身为None时,你直接访问了它的left属性。
看代码逻辑:
当dfs函数传入的node是None时,第一个if node条件不成立,会直接执行后面的if node.left判断。此时node是None,尝试访问node.left必然触发NoneType没有属性的错误——你混淆了“node.left为None”和“node本身是None”两种情况:
- 前者是
node存在,只是它的左子节点为空,这时候if node.left会判断为假,不会执行后续逻辑; - 后者是
node本身就是空对象,根本没有left属性,直接访问就会报错。
把if node.left和if node.right放到if node的代码块内后,只有node存在时才会去判断它的子节点,自然就避免了node为None时访问属性的错误。
内容的提问来源于stack exchange,提问作者User_04_04_2023
相关产品推荐
相关产品推荐

