当前位置: 首页 > news >正文

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

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

文章目录

  • 思路
  • 解题方法
  • 复杂度
  • Code

思路

解决这个问题的关键在于采用深度优先搜索(DFS)策略,并结合树形动态规划的思想。我们需要设计一个递归函数,它不仅能够遍历整棵树,还能收集到每个子树是否为BST的信息、该子树的最大值、最小值、总和以及最重要的是,以该节点为根的BST所能得到的最大键值和。

解题方法

我提出的解题方法是通过定义一个辅助类Info,用来存储递归过程中需要传递的五个关键信息:当前子树的最大值、最小值、作为BST时的最大键值和、子树的总和以及该子树是否为BST的布尔标记。递归函数f(TreeNode x)负责计算以x为根的子树的各种信息,并返回一个Info对象。

复杂度

时间复杂度:

O ( n ) O(n) O(n),每个节点被访问一次,其中n是树中的节点数。

空间复杂度:

O ( n ) O(n) O(n),递归调用栈的深度在最坏情况下会达到树的高度,即n(对于极端不平衡的树),但平均情况下要小得多。

Code

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public class Info{public int max;public int min;public int maxBstSum;public int sum;public boolean isBst;public Info(int max, int min, int maxBstSum, int sum, boolean isBst) {this.max = max;this.min = min;this.maxBstSum = maxBstSum;this.sum = sum;this.isBst = isBst;}}public int maxSumBST(TreeNode root) {return f(root).maxBstSum;}public Info f(TreeNode x) {if(x == null) {return new Info(Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0, true);}Info infol = f(x.left);Info infor = f(x.right);int max = Math.max(x.val, Math.max(infol.max, infor.max));int min = Math.min(x.val, Math.min(infol.min, infor.min));int sum = infol.sum + infor.sum +x.val;boolean isBst = infol.isBst && infor.isBst && infol.max < x.val && x.val < infor.min;int maxBstSum = Math.max(infol.maxBstSum, infor.maxBstSum);if(isBst) {maxBstSum = Math.max(maxBstSum, sum);}return new Info(max, min, maxBstSum, sum, isBst);}
}
http://www.lryc.cn/news/384933.html

相关文章:

  • 基于java + Springboot 的二手物品交易平台实现
  • Shopee本土店选品有什么技巧?EasyBoss ERP为你整理了6个高效选品的方法!
  • 3D在线展览馆的独特魅力,技术如何重塑展览业的未来?
  • 基于SpringBoot的藏区特产销售平台
  • hudi系列-schema evolution(一)
  • Redis-实战篇-缓存雪崩
  • 线性代数|机器学习-P18快速下降奇异值
  • 本地离线模型搭建指南-中文大语言模型底座选择依据
  • 【代码随想录】【算法训练营】【第51天】 [115]不同的子序列 [583]两个字符串的删除操作 [72]编辑距离
  • 24下半年软考集合!30s打破信息差!
  • 如何在Xcode中设置库路径
  • 小程序的基本使用
  • [保姆级教程]uniapp设置字体引入字体格式
  • 【Webpack】前端工程化之Webpack与模块化开发
  • 【Android】记录在自己的AMD处理器无法使用Android studio 虚拟机处理过程
  • LearnOpenGL - Android OpenGL ES 3.0 使用 FBO 进行离屏渲染
  • 人工智能虚拟仿真系统,解决算法难、编程难、应用场景难三大难题
  • CTE(公共表表达式)和视图在查询时的性能影响
  • 新能源行业必会基础知识-----电力市场概论笔记-----绪论
  • 003 SpringBoot操作ElasticSearch7.x
  • npm install报错Maximum call stack size exceeded
  • 第1章 基础知识
  • python脚本 限制 外部访问 linux服务器端口
  • Redis-哨兵模式-主机宕机-推选新主机的过程
  • 游戏工厂:AI(AIGC/ChatGPT)与流程式游戏开发
  • 每日一练 - OSPF 组播地址
  • AMHS工程师的培养
  • 如何在前端项目中制定代码注释规范
  • 一位苹果手机硬件工程师繁忙的一天
  • Python | 使用均值编码(MeanEncoding)处理分类特征