zoukankan      html  css  js  c++  java
  • 1026. Maximum Difference Between Node and Ancestor (M)

    Maximum Difference Between Node and Ancestor (M)

    题目

    Given the root of a binary tree, find the maximum value V for which there exist different nodes A and B where V = |A.val - B.val| and A is an ancestor of B.

    A node A is an ancestor of B if either: any child of A is equal to B, or any child of A is an ancestor of B.

    Example 1:

    Input: root = [8,3,10,1,6,null,14,null,null,4,7,13]
    Output: 7
    Explanation: We have various ancestor-node differences, some of which are given below :
    |8 - 3| = 5
    |3 - 7| = 4
    |8 - 1| = 7
    |10 - 13| = 3
    Among all possible differences, the maximum value of 7 is obtained by |8 - 1| = 7.
    

    Example 2:

    Input: root = [1,null,2,null,0,3]
    Output: 3 
    

    Constraints:

    • The number of nodes in the tree is in the range [2, 5000].
    • 0 <= Node.val <= 10^5

    题意

    找到一组结点,其中一个是另一个祖先结点,使得这两个结点的差值最大。

    思路

    递归处理,两种方法:

    1. 每次找到左子树和右子树中的最值,以此更新结果。
    2. 每次递归更新当前路径上的最大值和最小值,到达叶结点时计算差值并返回。

    代码实现

    Java

    递归1

    class Solution {
        private int diff;
    
        public int maxAncestorDiff(TreeNode root) {
            diff = 0;
            dfs(root);
            return diff;
        }
    
        private int[] dfs(TreeNode root) {
            if (root == null) {
                return null;
            }
    
            int[] l = dfs(root.left), r = dfs(root.right);
    
            if (l == null && r == null) {
                return new int[] { root.val, root.val };
            }
    
            int cMin = 0, cMax = 0;
            if (l != null && r != null) {
                cMin = Math.min(l[0], r[0]);
                cMax = Math.max(l[1], r[1]);
            } else if (l != null) {
                cMin = l[0];
                cMax = l[1];
            } else {
                cMin = r[0];
                cMax = r[1];
            }
            diff = Math.max(diff, Math.max(Math.abs(root.val - cMin), Math.abs(root.val - cMax)));
            return new int[] { Math.min(root.val, cMin), Math.max(root.val, cMax) };
        }
    }
    

    递归2

    class Solution {
        public int maxAncestorDiff(TreeNode root) {
            if (root == null) {
                return 0;
            }
    
            return dfs(root, root.val, root.val);
        }
    
        private int dfs(TreeNode root, int max, int min) {
            if (root == null) {
                return max - min;
            }
    
            max = Math.max(root.val, max);
            min = Math.min(root.val, min);
            return Math.max(dfs(root.left, max, min), dfs(root.right, max, min));
        }
    }
    
  • 相关阅读:
    JavaScript设计模式
    《现代操作系统(中文第三版)》课后习题——第一章 绪论
    hadoop基础----hadoop理论(四)-----hadoop分布式并行计算模型MapReduce具体解释
    linux 改动rootpassword以及忘记rootpassword
    Android画图之抗锯齿 paint 和 Canvas 两种方式
    Rect参数的简易理解方式
    关于新建android项目时 appcompat_v7报错问题的一点总结
    关于seo优化的核心思想
    关于 android 读取当前手机号码
    关于 android 返回键 代码实现
  • 原文地址:https://www.cnblogs.com/mapoos/p/13952182.html
Copyright © 2011-2022 走看看