Leetcode 1373. 二叉搜索子树的最大键值和(困难)
思路:labuladong
题目:
给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。
*
* 二叉搜索树的定义如下:
* 任意节点的左子树中的键值都 小于 此节点的键值。
* 任意节点的右子树中的键值都 大于 此节点的键值。
* 任意节点的左子树和右子树都是二叉搜索树。
比如题目给了这个例子:
如果输入这棵二叉树,算法应该返回 20,也就是图中绿圈的那棵子树的节点值之和,因为它是一棵 BST,且节点之和最大。
那有的读者可能会问,根据 BST 的定义,有没有可能一棵二叉树中不存在 BST?
不会的,因为按照 BST 的定义,任何一个单独的节点肯定是 BST,也就是说,再不济,二叉树最下面的叶子节点肯定是 BST
思路:
递归到每个节点时,我们需要知道左右子树是否为bst、最大值、最小值、累加值。然后通过这些信息判断以该节点为根节点的子树是否为bst。
因此使用后序遍历,在递归时同时获取这些值并返回
class Solution { public: int maxsum=0; int maxSumBST(TreeNode* root) { traverse(root); return maxsum; } struct Param { bool isbst; int min; int max; int sum; }; Param traverse(TreeNode* root){ if(root==nullptr){ return {true,INT_MAX,INT_MIN,0}; } Param leftp=traverse(root->left); Param rightp=traverse(root->right); Param p; if(leftp.isbst&&rightp.isbst&& root->val>leftp.max&& root->val<rightp.min){ p.isbst=true; p.min=min(root->val,leftp.min); p.max=max(root->val,rightp.max); p.sum=leftp.sum+root->val+rightp.sum; maxsum=max(maxsum,p.sum); }else{ p.isbst=false; } return p; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
分类:
leetcode
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2017-02-10 android studio——Could not find method externalNativeBuild()