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

news/2024/7/20 21:36:35 标签: leetcode, 算法, 深度优先, 题解, BST

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

力扣题目链接:https://leetcode.cn/problems/maximum-sum-bst-in-binary-tree/

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

二叉搜索树的定义如下:

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

 

示例 1:

leetcode-cn.com/aliyun-lc-upload/uploads/2020/03/07/sample_1_1709.png" />

输入:root = [1,4,3,2,4,2,5,null,null,null,null,null,null,4,6]
输出:20
解释:键值为 3 的子树是和最大的二叉搜索树。

示例 2:

leetcode-cn.com/aliyun-lc-upload/uploads/2020/03/07/sample_2_1709.png" />

输入:root = [4,3,null,1,2]
输出:2
解释:键值为 2 的单节点子树是和最大的二叉搜索树。

示例 3:

输入:root = [-4,-2,-5]
输出:0
解释:所有节点键值都为负数,和最大的二叉搜索树为空。

示例 4:

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

示例 5:

输入:root = [5,4,8,3,null,6,3]
输出:7

 

提示:

  • 每棵树有 140000 个节点。
  • 每个节点的键值在 [-4 * 10^4 , 4 * 10^4] 之间。

方法一:深度优先搜索

定义结构体MyNode来描述子树的情况。

struct MyNode {
    int minValue;  // 子树最小值
	int maxValue;  // 子树最大值
	int sumValue;  // 子树节点和
    bool isBST;    // 子树是否为二叉搜索树
};

接着定义dfs函数来递归地判断子树。

  • 如果当前节点为空,则认为是空的二叉搜索树。为了方便,我们将空的BST最小值定义为“无穷大”,最大值定义为“无穷小”,这样不论节点的左子为空还是右子为空,都满足左子最大值小于根,右子最小值大于根
  • 否则,递归获取左右子树的信息。
    • 如果左右子都是BST,并且满足左子最大值小于根,右子最小值大于根,那么当前节点同样是BST
    • 否则,当前节点不是BST,返回的MyNode的isBST需要为false
MyNode dfs(TreeNode* root) {
	if (!root) {
		return MyNode(INT_MAX, INT_MIN, 0, true);
	}
	MyNode left = dfs(root->left);
	MyNode right = dfs(root->right);
	if (BST) {
		构造这个节点的MyNode,返回前更新答案最大值
	}
	else {
		返回isBSTfalse的MyNode
	}
}
  • 时间复杂度 O ( n ) O(n) O(n),其中 n n n是二叉树的节点个数
  • 空间复杂度 O ( n ) O(n) O(n)

AC代码

C++

struct MyNode {
    int minValue, maxValue, sumValue;
    bool isBST;
    MyNode(int minValue, int maxValue, int sumValue, bool isBST) : minValue(minValue), maxValue(maxValue), sumValue(sumValue), isBST(isBST) {};
};


class Solution {
private:
    int ans;

    MyNode dfs(TreeNode* root) {
        if (!root) {
            return MyNode(INT_MAX, INT_MIN, 0, true);
        }
        MyNode left = dfs(root->left), right = dfs(root->right);
        if (left.isBST && right.isBST && left.maxValue < root->val && right.minValue > root->val) {
            MyNode toReturn(min(left.minValue, root->val), max(right.maxValue, root->val), left.sumValue + right.sumValue + root->val, true);  // 这里min和max是因为left为空的话left.minValue为INT_MAX
            ans = max(ans, toReturn.sumValue);
            return toReturn;
        }
        else {
            return MyNode(0, 0, 0, false);
        }
    }
public:
    int maxSumBST(TreeNode* root) {
        ans = 0;
        dfs(root);
        return ans;
    }
};

Python

# from typing import Optional

# # Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right


class MyNode:
    def __init__(self, minValue: int, maxValue: int, sumValue: int, isBST: bool):
        self.minValue = minValue
        self.maxValue = maxValue
        self.sumValue = sumValue
        self.isBST = isBST


class Solution:
    def dfs(self, root: Optional[TreeNode]) -> MyNode:
        if not root:
            return MyNode(1e9, -1e9, 0, True)
        left = self.dfs(root.left)
        right = self.dfs(root.right)
        if left.isBST and right.isBST and left.maxValue < root.val and right.minValue > root.val:
            toReturn = MyNode(min(left.minValue, root.val), max(right.maxValue, root.val), left.sumValue + right.sumValue + root.val, True)
            self.ans = max(self.ans, toReturn.sumValue)
            return toReturn
        else:
            return MyNode(0, 0, 0, False)

    def maxSumBST(self, root: Optional[TreeNode]) -> int:
        self.ans = 0
        self.dfs(root)
        return self.ans

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/130779067


http://www.niftyadmin.cn/n/341520.html

相关文章

工具及方法 - 查询参考资料的网站

做学术&#xff0c;要做实验写论文&#xff0c;以及做科研或解决技术问题&#xff0c;需要面对三个问题&#xff1a; 资料去哪里找&#xff1f; 数据在哪里查&#xff1f; 参考文献在哪里下&#xff1f; 综合型论文、文献网站推荐 1、掌桥科研 网站地址&#xff1a; 掌桥科…

RocketMQ Connect 核心知识点概述

一、概览 RocketMQ Connect是RocketMQ数据集成重要组件&#xff0c;可将各种系统中的数据通过高效&#xff0c;可靠&#xff0c;流的方式&#xff0c;流入流出到RocketMQ&#xff0c;它是独立于RocketMQ的一个单独的分布式&#xff0c;可扩展&#xff0c;可容错系统&#xff0…

uvc摄像头驱动uvc设备的注册分析

uvc摄像头驱动uvc设备的注册分析 文章目录 uvc摄像头驱动uvc设备的注册分析uvc_inituvc_probeuvc_register_videouvc_register_chainsuvc_register_termsuvc_register_video uvc_ioctl_opsuvc_fops uvc_init /driver/media/usb/uvc/uvc_driver.c /** UVC 驱动结构体*/ struct…

VMware虚拟机三种网络模式详解之Host-Only(仅主机模式)

VMware虚拟机三种网络模式详解 Host-Only&#xff08;仅主机模式&#xff09; 三、Host-Only&#xff08;仅主机模式&#xff09; Host-Only模式其实就是NAT模式去除了虚拟NAT设备&#xff0c;然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机…

每日学术速递5.17

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.HACK: Learning a Parametric Head and Neck Model for High-fidelity Animation 标题&#xff1a;HACK&#xff1a;学习用于高保真动画的参数化头颈模型 作者&#xff1a;Longwe…

【STC8】热启动串口指令下载

前言 在目标开发板没有装载自动下载电路的时候&#xff0c;往往需要冷启动&#xff0c;也就是需要手动开关电源&#xff0c;来达到单片机复位下载。当然还有一种方法是热启动&#xff0c;通过串口接收到自定义的指令后&#xff0c;软件执行复位下载。这就是本文介绍的内容。 材…

编程不头秃,Google「AI程序员」来了,聊天就能敲代码

上周 Google 在 I/O 大会宣布了一个能够辅助编程的聊天机器人 Codey&#xff0c;现在它终于上线 Google Colab 啦&#xff01; &#x1f31f; Codey 是基于 Google 目前最新的大语言模型 PaLM 2 运行&#xff0c;有着强大的语言理解和编程能力。 Codey 有这些功能&#xff1…

10个你应该知道的JavaScript字符串的基础知识

今天这篇文章眼于 JavaScript 中字符串的 10 个最重要的知识。 1.使用单引号和双引号创建字符串 字符串可以用单引号和双引号定义。 "text" text他们都创建了几乎相同的字符串。 "text" text //true这样的字符串必须适合单行&#xff0c;我们不能以这…