【LeetCode 每日一题】1026. 节点与其祖先之间的最大差值

73 阅读1分钟

1026. 节点与其祖先之间的最大差值

难度:中等

时间:2023/04/18


给定二叉树的根节点 root,找出存在于 不同 节点 A 和 B 之间的最大值 V,其中 V = |A.val - B.val|,且 A 是 B 的祖先。

(如果 A 的任何子节点之一为 B,或者 A 的任何子节点是 B 的祖先,那么我们认为 A 是 B 的祖先)

示例 1:

输入:root = [8,3,10,1,6,null,14,null,null,4,7,13]
输出:7
解释: 
我们有大量的节点与其祖先的差值,其中一些如下:
|8 - 3| = 5
|3 - 7| = 4
|8 - 1| = 7
|10 - 13| = 3
在所有可能的差值中,最大值 7 由 |8 - 1| = 7 得出。

示例 2:

输入:root = [1,null,2,null,0,3]
输出:3

提示:

  • 树中的节点数在 2 到 5000 之间。
  • 0 <= Node.val <= 10^5

解题思路:

  • 使用全局变量保存最大差值,进行dfs,每次递归查找当前路径的最大值和最小值,到达叶子节点时使用当前路径的最大值和最小值更新全局变量。

  • 设我们要求解的值为v,则v=|A.val-B.val|经过变形,得到 A.val-B.val=v (A.val>=B.val条件下) or A.val-B.val=-v (A.val<B.val条件下) 则要使得|A.val-B.val|最大,要么是A.val>=B.val条件下的最大正数v,要么是A.val<B.val条件下的最小负数-v

  • 求得最大正数和最小负数后,取两者中绝对值最大的即为解

  • A是B的祖先,则需要使用dfs进行遍历,从上到下,就自动维护了A是B的祖先

  • 经过上面的分析,我们可以得知,要使得|A.val-B.val|最大,就要使得A.val-B.val要么是最大的正数,要么是最小的负数所以我们要维护根节点到叶子结点这条路径上的最大值和最小值,只有可能这两个值减去当前结点值,才可能产生最大的正数或者最小的负数

    class Solution {
        int ans = 0;
        public int maxAncestorDiff(TreeNode root) {
            if (root == null){
                return 0;
            }
            dfs(root, root.val, root.val);
            return ans;
        }
        public void dfs(TreeNode root, int max, int min){
            if (root == null){
                return;
            }
            max = Math.max(max, root.val);
            min = Math.min(min, root.val);
            dfs(root.left, max, min);
            dfs(root.right, max, min);
            ans = Math.max(ans, max - min);
        }
    ​
    }