Python递归计算二叉树直径时depth恒为0的问题排查
问题原因分析
- Python中整数是不可变类型,函数参数传递为值传递。你在
diameterOfBinaryTree里定义的depth = 0传入dfs后,函数内对depth的重新赋值仅修改了局部变量,完全不会影响外部的depth,所以最终返回值始终是初始的0。 - 额外问题:
dfs中空节点返回传入的depth逻辑错误,空节点的深度应该固定为0,而非继承传入的参数值。
解决方法
提供两种实用修正方案:
方案1:使用类实例变量存储直径值
将直径值设为类的实例属性,递归时直接修改该属性,规避参数传递的局限:
class Solution: def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int: self.diameter = 0 # 用实例变量维护最大直径 self.dfs(root) return self.diameter def dfs(self, root): if root is None: return 0 # 空节点深度固定为0 left_depth = self.dfs(root.left) right_depth = self.dfs(root.right) # 更新全局最大直径:当前节点左右子树深度之和 self.diameter = max(self.diameter, left_depth + right_depth) # 返回当前节点作为根的子树深度 return 1 + max(left_depth, right_depth)
方案2:使用可变对象传递状态
利用列表是可变类型的特性,让函数内部的修改能同步到外部:
class Solution: def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int: diameter = [0] # 用列表存储,可变类型支持外部修改 self.dfs(root, diameter) return diameter[0] def dfs(self, root, diameter): if root is None: return 0 left_depth = self.dfs(root.left, diameter) right_depth = self.dfs(root.right, diameter) diameter[0] = max(diameter[0], left_depth + right_depth) return 1 + max(left_depth, right_depth)
补充说明
二叉树直径是树中任意两节点路径长度的最大值,路径不一定经过根节点,因此递归时要区分两个逻辑:一是更新全局最大直径,二是返回当前节点的子树深度。
内容的提问来源于stack exchange,提问作者117__pushpak raj__
相关产品推荐
相关产品推荐

