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

题目

Leetcode 1026. 节点与其祖先之间的最大差值
在这里插入图片描述

思路

记录当前路径的最大值和最小值,到叶节点时则可得到,当前路径的最大差值。
两种思路:
1、自顶向下(递):
从上到下,先序遍历的方式,同时维护上面结点的最大值和最小值。当前路径的最大值和最小值通过参数传递。
2、自底向上(归)
当前路径的最大值和最小值,通过函数返回值,从下往上传递。

  • 对于自底向上(归)的方法有个细节,curMin和curMax得到的是以当前节点为根节点的子树的最大值和最小值,由于最大值和最小值可能来自一个来自左节点,一个来自右节点,所以应该用当前节点的值分别与这两最值作差,取其中最大的作为一条路径的最大差值。
  • 而对于自顶向下的方法,由于是已经访问过的路径的最大值,最小值,他们处于同一路径,无需关心来自不同路径了,所以可以直接取curMax-curMin

代码(25 11.28首刷)

//方法一:自顶向下(递):
class Solution {
public:
    //记录当前路径的最大值和最小值
    int maxDiff = INT_MIN;
    void dfs(TreeNode* root, int curMin, int curMax){
        if(!root) return ;
        curMin = min(root->val, curMin);
        curMax = max(root->val, curMax);
        maxDiff = max(curMax - curMin, maxDiff);
        dfs(root->left, curMin, curMax);
        dfs(root->right, curMin, curMax);
    }
    int maxAncestorDiff(TreeNode* root) {
        dfs(root, INT_MAX, INT_MIN);
        return maxDiff;
    }
};

// 方法二:自底向上
class Solution {
public:
    //得到以当前节点为根节点的子树的最大值和最小值,由于最大值和最小值可能来自一个来自左节点,一个来自右节点,所以应该用当前节点的值分别与这两作差得到一条路径的最大差值。
    int maxDiff = INT_MIN;
    pair<int, int> dfs(TreeNode* root){
        if(!root) return {INT_MAX, INT_MIN};
        auto [l_mn, l_mx] = dfs(root->left);
        auto [r_mn, r_mx] = dfs(root->right);

        int curMin = min(root->val, min(l_mn, r_mn));
        int curMax = max(root->val, max(l_mx, r_mx));
        maxDiff = max(maxDiff, max(root->val - curMin, curMax - root->val));
        return {curMin, curMax};
    }
    int maxAncestorDiff(TreeNode* root) {
        dfs(root);
        return maxDiff;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值