LeetCode 543. 二叉树的直径:解法仅通过100/104测试用例,特定测试用例结果不符求助
解决LeetCode 543:二叉树的直径的错误排查与修正
嘿,我来帮你理清楚这个问题的症结所在~
问题核心原因
你的解法只考虑了经过根节点的最长路径,但题目明确说明二叉树的直径是任意两个节点之间的最长路径——这条路径完全可能藏在某个子树内部,根本不经过根节点。比如你提到的那个复杂测试用例,最长路径就存在于根节点的右子树(-3)内部,你的代码没捕捉到这个情况,所以返回了错误的结果。
原代码的问题点
先看你的代码:
def diameterOfBinaryTree(self, root): return self.getHeight(root.left) + self.getHeight(root.right) def getHeight(self, root): if not root: return 0 return max(self.getHeight(root.left), self.getHeight(root.right)) + 1
这段逻辑的局限性很明显:它只计算了根节点左右子树的高度之和,完全没去跟踪遍历子树过程中可能出现的、更大的路径长度。
修正后的解决方案
我们需要在计算每个节点高度的同时,实时跟踪记录遍历过程中出现的最大直径值。这里可以用一个类变量来维护这个最大值(或者用可变对象传递,比如列表,因为Python整数是不可变类型)。
修正后的代码示例:
class Solution: def diameterOfBinaryTree(self, root): self.max_diameter = 0 # 全局变量记录最大直径 def get_height(node): if not node: return 0 # 递归计算左右子树高度 left_h = get_height(node.left) right_h = get_height(node.right) # 计算当前节点作为路径中点的直径,更新全局最大值 self.max_diameter = max(self.max_diameter, left_h + right_h) # 返回当前节点的高度,供父节点计算使用 return max(left_h, right_h) + 1 get_height(root) return self.max_diameter
代码逻辑解释
- 我们用
self.max_diameter来保存遍历过程中发现的最长直径,初始值设为0。 - 在递归计算每个节点高度的同时,我们会计算以当前节点为中间点的路径长度(左右子树高度之和),并和全局最大值比较,更新最大值。
- 递归完成后,
self.max_diameter就是整个二叉树的最长直径,直接返回即可。
这样修改后,无论是经过根节点的路径,还是藏在子树内部的路径,都会被正确计算并比较,完美覆盖所有测试用例。
内容的提问来源于stack exchange,提问作者Alex Nguyen
相关产品推荐
相关产品推荐

