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

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__

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 02:51:21