2023-05-20 LeetCode每日一题(二叉搜索子树的最大键值和)

2023-05-20每日一题

一、题目编号

1373. 二叉搜索子树的最大键值和

二、题目链接

点击跳转到题目位置

三、题目描述

给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。

二叉搜索树的定义如下:

  • 任意节点的左子树中的键值都 小于 此节点的键值。
  • 任意节点的右子树中的键值都 大于 此节点的键值。
  • 任意节点的左子树和右子树都是二叉搜索树。

四、解题代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 *    };
 */
class Solution {
    const int inf = 40010;
    struct judge {
        bool IsTrue;
        int min_val;
        int max_val;
        int sum_val;
        judge(bool IsTrue, int min_val, int max_val, int sum_val) : IsTrue(IsTrue), min_val(min_val), max_val(max_val), sum_val(sum_val) {}
    };

    int max0 = 0;
    judge dfs(TreeNode *root){
        if(root == nullptr){
            return judge(true, 0, 0, 0);
        }
        if(root->left == nullptr && root->right == nullptr){
            max0 = max(max0, root->val); 
            return judge(true, root->val, root->val, root->val);
        }
        judge left = dfs(root->left); 
        judge right = dfs(root->right);          
        if(left.IsTrue == true && right.IsTrue == true){
            int min_val = inf;
            int max_val = -inf;
            int sum_val = 0;
            if(root->left != nullptr){
                if(root->val <= left.max_val || root->val <= root->left->val){
                    return judge(false, 0, 0, 0);
                }
                min_val = min(left.min_val, min_val);
                max_val = max(left.max_val, max_val);
                sum_val += left.sum_val;
            }
            if(root->right != nullptr){
                if(root->val >= right.min_val || root->val >= root->right->val){
                    return judge(false, 0, 0, 0);
                }
                min_val = min(right.min_val, min_val);
                max_val = max(right.max_val, max_val);
                sum_val += right.sum_val;
            }
            sum_val += root->val;
            max0 = max(sum_val, max0);
            return judge(true, min_val, max_val, sum_val);
        } 
    return judge(false, 0, 0, 0);
    }

public:
    int maxSumBST(TreeNode* root) {
        dfs(root);
    return max0;
    }
};

五、解题思路

(1) 首先建立数据结构,设置该结点左右子树中的最小值,最大值,键值和与总判断以该结点的树是否是二叉搜索树。

(2) 进行后序遍历,如果以该结点的树是二叉搜索树(是叶子结点或者左右子树都是二叉搜索树并且该结点与左右结点满足二叉搜索树),则更新最大值并且更新最小值,最大值,键值和与是否为二叉搜索树。

(3) 最后返回最大键值和即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值