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

递归中如何正确存储值?二叉树直径解法的面试合规性疑问

关于LeetCode 543题中使用类变量记录结果的面试可行性分析

你的这种实现方式在技术面试里完全是可接受的,理由如下:

  • 逻辑直观清晰:通过递归遍历每个节点,在计算左右子树深度的同时,实时更新全局的最长路径值,代码简洁易懂,核心逻辑一目了然。
  • 符合Python的常规用法:利用类的实例变量self.ans在方法间共享状态,是Python面向对象编程的标准操作,面试官不会因为这个写法判定你不合格。

当然,可能会有面试官关注“无状态”的实现方式,你可以提前准备几种替代方案,展示你的灵活性:

方案1:用可变对象(比如列表)传递结果

通过列表这种可变类型,在递归过程中修改内部的值,避免使用类变量:

class Solution:
    def traverse(self, cur, ans):
        if not cur:
            return -1
        l = self.traverse(cur.left, ans) + 1
        r = self.traverse(cur.right, ans) + 1
        ans[0] = max(ans[0], l + r)
        return max(l, r)
    
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        ans = [0]
        self.traverse(root, ans)
        return ans[0]

方案2:递归返回多个值

让递归函数同时返回当前节点的最大深度,以及当前子树内的最长路径,避免依赖外部状态:

class Solution:
    def traverse(self, cur):
        if not cur:
            return (-1, 0)  # 第一个值是当前节点的最大深度,第二个是当前子树的最长路径
        l_depth, l_diam = self.traverse(cur.left)
        r_depth, r_diam = self.traverse(cur.right)
        curr_depth = max(l_depth, r_depth) + 1
        curr_diam = max(l_diam, r_diam, l_depth + 1 + r_depth + 1)
        return (curr_depth, curr_diam)
    
    def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        _, diam = self.traverse(root)
        return diam

面试时的核心考察点是代码正确性、逻辑清晰度,以及你对自己实现思路的解释能力。你当前的写法没有问题,只要能讲清楚为什么用类变量、它的工作流程,就完全可以。如果面试官提出不同的写法偏好,你能快速给出替代方案,会更能体现你的技术功底。

内容的提问来源于stack exchange,提问作者高造擎

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:15:09