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

Python实现二叉树最大深度遇错,求与C++递归实现的差异原因

问题分析与解决

嘿,我来帮你排查这个问题!你的Python代码之所以出错,核心问题是变量作用域的误用,而不是Python和C++的递归逻辑有本质差异。

错误原因拆解

你在C++代码里用的是局部变量l和r来存储左右子树的深度:

int l=maxDepth(root->left);
int r=maxDepth(root->right);

每次递归调用时,这两个变量都是当前函数栈帧里的独立变量,不同递归层级之间不会互相干扰。

但在Python代码里,你错误地使用了类实例属性self.left和self.right:

self.left=self.maxDepth(root.left)
self.right=self.maxDepth(root.right)

self是Solution类的同一个实例,这些属性是全局共享的。在递归过程中,后续的递归调用会覆盖掉之前赋值的self.left和self.right的值,导致最终计算时拿到的不是当前节点的左右子树深度,而是最后一次递归的结果,自然会返回错误的深度值。

修正后的Python代码

只需要把实例属性换成局部变量,逻辑就和C++完全一致了:

class Solution(object):
    def maxDepth(self, root):
        if root is None:
            return 0
        # 用局部变量存储递归结果,避免被后续递归覆盖
        left = self.maxDepth(root.left)
        right = self.maxDepth(root.right)
        return max(left, right) + 1

这个版本在测试用例[1,2,3,4,5]中会正确返回最大深度3。

递归本质的差异?

其实Python和C的递归核心逻辑是完全一致的——都是基于函数调用栈的深度优先遍历。两者的差异只在于变量作用域的处理规则:C的局部变量默认是栈帧隔离的,而Python的实例属性属于对象,会在整个实例生命周期内共享。只要你遵循各自的变量作用域规则写代码,递归的行为是完全相同的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 07:54:10