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

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

代码逻辑解释

  1. 我们用self.max_diameter来保存遍历过程中发现的最长直径,初始值设为0。
  2. 在递归计算每个节点高度的同时,我们会计算以当前节点为中间点的路径长度(左右子树高度之和),并和全局最大值比较,更新最大值。
  3. 递归完成后,self.max_diameter就是整个二叉树的最长直径,直接返回即可。

这样修改后,无论是经过根节点的路径,还是藏在子树内部的路径,都会被正确计算并比较,完美覆盖所有测试用例。

内容的提问来源于stack exchange,提问作者Alex Nguyen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 18:02:34