递归中如何正确存储值?二叉树直径解法的面试合规性疑问
关于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,提问作者高造擎
相关产品推荐
相关产品推荐

