解决LeetCode 617.Merge Two Binary Trees时遇AttributeError问题求助
解决LeetCode 617. 合并二叉树递归代码中的AttributeError问题
你的代码触发AttributeError: 'NoneType' object has no attribute 'left'的原因很明确:当递归到某一层时,root1或root2其中一个是None,但你仍然尝试访问它的left或right属性。
举个例子:假设当前root1是None,root2是一个有效节点,你创建了root3后,执行self.mergeTrees(root1.left, root2.left)——这里root1是None,访问root1.left自然会报错,因为NoneType没有left属性。
修正后的代码
class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class Solution: def mergeTrees(self, root1, root2): if not root1 and not root2: return None # 明确返回None,避免隐式返回None导致的混淆 # 创建当前合并节点 if root1 and root2: root3 = TreeNode(root1.val + root2.val) elif root1: root3 = TreeNode(root1.val) else: root3 = TreeNode(root2.val) # 递归处理左右子树:先判断节点是否存在,再取子节点,否则传None root3.left = self.mergeTrees(root1.left if root1 else None, root2.left if root2 else None) root3.right = self.mergeTrees(root1.right if root1 else None, root2.right if root2 else None) return root3 # 测试代码 p = TreeNode(1) p.left = TreeNode(2) p.left.left = TreeNode(3) p.left.right = TreeNode(4) p.right = TreeNode(2) p.right.left = TreeNode(4) p.right.right = TreeNode(3) q = TreeNode(1) q.left = TreeNode(2) q.left.left = TreeNode(4) q.left.right = TreeNode(5) q.left.left.left = TreeNode(8) q.left.left.right = TreeNode(9) q.right = TreeNode(3) q.right.left = TreeNode(6) q.right.right = TreeNode(7) merged = Solution().mergeTrees(p, q)
额外优化建议
其实你可以简化递归逻辑:如果其中一个节点为空,直接返回另一个节点(不需要重新创建新节点),这样代码更简洁高效:
class Solution: def mergeTrees(self, root1, root2): if not root1: return root2 if not root2: return root1 # 两个节点都存在时,合并值并递归处理子树 root1.val += root2.val root1.left = self.mergeTrees(root1.left, root2.left) root1.right = self.mergeTrees(root1.right, root2.right) return root1
这种写法不需要额外创建新的TreeNode实例,直接复用其中一个树的节点,完全符合题目要求的合并逻辑。
内容的提问来源于stack exchange,提问作者Nei
相关产品推荐
相关产品推荐

