二叉树遍历为何需要辅助函数?以LeetCode 110题为例
关于LeetCode 110. 平衡二叉树无辅助函数解法的问题
我在研究LeetCode 110. Balanced Binary Tree的解法,题目要求判断给定二叉树是否为高度平衡二叉树(高度平衡二叉树指每个节点的两个子树深度差不超过1)。我发现社区所有解法都使用了辅助函数,其他二叉树遍历类问题也普遍如此。我尝试不使用辅助函数实现的代码逻辑与标准解法类似,但部分测试用例无法通过,想了解其中原因。
标准解法
class Solution(object): def isBalanced(self, root): def dfs(root): if not root: return [True, 0] left = dfs(root.left) right = dfs(root.right) balanced = left[0] and right[0] and abs(left[1] - right[1]) <= 1 return [balanced, 1 + max(left[1], right[1])] return dfs(root)[0]
我的代码
class Solution(object): def isBalanced(self, root): if not root: return [True, 0] left = self.isBalanced(root.left) right = self.isBalanced(root.right) balanced = left[0] and right[0] and abs(left[1] - right[1]) <= 1 return [balanced, 1 + max(left[1], right[1])]
问题原因
你的代码核心逻辑和标准解法完全一致,但问题出在返回值不符合题目要求的接口规范。
LeetCode对isBalanced函数的要求是返回布尔值(True或False),但你的代码返回的是一个包含布尔值和树高度的列表[balanced, height]。当LeetCode调用你的函数时,它会直接把这个列表当作最终结果处理:
- 哪怕树是不平衡的,你返回的
[False, x]在Python的布尔判断里会被认定为True(非空列表都为真),这就导致测试用例判断错误。 - 标准解法里,内部辅助函数
dfs负责返回列表,但外层的isBalanced会提取列表的第一个元素(布尔值)返回,完全符合题目要求的返回类型。
修复方案
如果你不想用辅助函数,可以调整代码,让函数在顶层调用时返回布尔值,递归过程中传递状态。比如可以改成这样:
class Solution(object): def isBalanced(self, root): # 用列表传递平衡状态,避免不可变类型无法在递归中修改外层变量的问题 balanced = [True] def get_height(node): if not node or not balanced[0]: return 0 left_h = get_height(node.left) right_h = get_height(node.right) if abs(left_h - right_h) > 1: balanced[0] = False return 1 + max(left_h, right_h) get_height(root) return balanced[0]
或者更简单的方式,还是保留辅助函数的写法——这也是社区解法普遍用辅助函数的原因:可以清晰区分内部递归逻辑(需要返回多个值)和对外接口(只需要返回布尔值),避免返回类型不匹配的问题。
内容的提问来源于stack exchange,提问作者evan.tann
相关产品推荐
相关产品推荐

