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

Java节点与祖先最大差值问题代码异常排查求助

问题分析

你的代码只计算了直接父节点与子节点的差值,但题目要求的是任意节点与其所有祖先节点(包括隔代祖先)的最大差值。比如存在这样的树:10 -> 5 -> 3,原代码只会计算10-5=5和5-3=2,但实际上10-3=7才是最大差值,这就是大型测试用例出错的核心原因。

修正方案

我们需要在遍历树的过程中,记录当前节点所有祖先中的最大值,然后计算当前节点与这个最大值的差值,全程跟踪最大的差值。以下是优化后的代码:

class Tree {
    // 用于跟踪全局最大差值
    private int maxDiffValue;

    //Function to return the maximum difference between any node and its ancestor.
    int maxDiff(Node root) {
        if (root == null) return 0;
        maxDiffValue = Integer.MIN_VALUE;
        // 初始时,祖先的最大值就是根节点的值
        traverse(root, root.data);
        return maxDiffValue;
    }

    private void traverse(Node node, int maxAncestor) {
        if (node == null) return;

        // 计算当前节点与祖先最大值的差值,更新全局最大差值
        int currentDiff = maxAncestor - node.data;
        if (currentDiff > maxDiffValue) {
            maxDiffValue = currentDiff;
        }

        // 更新祖先最大值:当前节点也会成为其子节点的祖先
        int newMaxAncestor = Math.max(maxAncestor, node.data);

        // 递归遍历左右子树
        traverse(node.left, newMaxAncestor);
        traverse(node.right, newMaxAncestor);
    }
}

如果题目要求的是绝对值最大的差值(比如后代值远大于祖先值的情况),则需要同时跟踪祖先的最大值和最小值,计算两种差值的绝对值:

class Tree {
    private int maxDiffValue;

    int maxDiff(Node root) {
        if (root == null) return 0;
        maxDiffValue = Integer.MIN_VALUE;
        traverse(root, root.data, root.data);
        return maxDiffValue;
    }

    private void traverse(Node node, int maxAncestor, int minAncestor) {
        if (node == null) return;

        // 计算当前节点与祖先最值的差值绝对值,更新最大差值
        int diff1 = Math.abs(maxAncestor - node.data);
        int diff2 = Math.abs(minAncestor - node.data);
        maxDiffValue = Math.max(maxDiffValue, Math.max(diff1, diff2));

        // 更新祖先的最值
        int newMax = Math.max(maxAncestor, node.data);
        int newMin = Math.min(minAncestor, node.data);

        traverse(node.left, newMax, newMin);
        traverse(node.right, newMax, newMin);
    }
}
关键改进点
  • 不再局限于直接父子节点的差值,覆盖了所有祖先与后代的组合
  • 递归过程中传递路径上的最值,确保每个节点都能和所有祖先计算差值
  • 时间复杂度为O(n),每个节点仅遍历一次,完全适配大型测试用例

内容的提问来源于stack exchange,提问作者SEJAL PITHADIA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:49:54