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
相关产品推荐
相关产品推荐

