Python 2元组树结构深度计算递归函数实现求助
解决Python 2中递归计算元组树深度的问题
你的思路方向是对的——给叶子节点记0,非叶子节点取子节点深度最大值加1,但原函数的逻辑有几个小问题导致无法正确运行,我帮你修正并解释清楚。
先看原函数的问题点
- 未处理叶子节点边界:当输入是单个叶子(比如
'x'),原函数会尝试执行len(expr),但字符串的len返回的是字符长度,这完全不是我们要的,而且会进入错误的循环流程。 - 判断逻辑搞反:原函数里
isinstance(expr,(list,tuple)) == 0判断的是当前外层的expr,但我们需要判断的是循环里的子元素是否为叶子节点。 - 循环内提前返回:
if len(a) == len(expr): return max(a)会导致循环还没遍历完所有子节点就提前返回,结果肯定不对。
修正后的递归函数
def depth(expr): # 叶子节点:不是列表或元组,深度为0 if not isinstance(expr, (list, tuple)): return 0 # 非叶子节点,遍历所有子节点计算深度 max_child_depth = 0 for item in expr: child_depth = depth(item) if child_depth > max_child_depth: max_child_depth = child_depth # 当前节点深度 = 子节点最大深度 + 1(自身这一层) return 1 + max_child_depth
测试你的输入示例
ls0 = 'x' ls1 = ('expt', 'x', 2) ls2 = ('+', ('expt', 'x', 2), ('expt', 'y', 2)) ls4 = ('/', ('expt', 'x', 5), ('expt', ('-', ('expt', 'x', 2),1), ('/', 5, 2))) print(depth(ls0)) # 输出 0(符合叶子节点的定义) print(depth(ls1)) # 输出 1 print(depth(ls2)) # 输出 2 print(depth(ls4)) # 输出 4
逻辑解释
完全贴合你的思路:
- 遇到叶子节点(非列表/元组类型)直接返回0;
- 遇到非叶子节点,递归遍历每一个子节点,找到子节点的最大深度;
- 当前节点的深度就是子节点最大深度加1(因为自身也是一层),递归向上传递这个值,最终得到整棵树的深度。
内容的提问来源于stack exchange,提问作者Operationbackfire
相关产品推荐
相关产品推荐

