【Leetcode 1373】二叉搜索子树的最大键值和
https://leetcode-cn.com/problems/maximum-sum-bst-in-binary-tree/
题解
关键点:
1、判断是否二叉搜索树
2、是的话拿到键值和
判断二叉搜索树可以通过比较当前节点,当前节点左子树最大值和当前节点右子树最小值来实现;键值和可以在这个dfs的过程中记录得到;一旦有一个子树不是二叉搜索树了,就不需要键值和了,整个分支被放弃。
注意NULL节点的处理。
/**
* 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) {}
* };
*/
#define PII pair<int,int>
#define PBI pair<bool,int>
#define P pair<PBI,PII>
#define MAX 40001
#define MIN -40001
class Solution {
public:
int maxsum=0;
P search(TreeNode* root)
{
//if(root==NULL)printf("NULL\n");
//else printf("%d\n",root->val);
if(root==NULL)return P(PBI(true,0),PII(MAX,MIN));
//判断是不是二叉搜索树
//如果是则判断是否和大,不是则结束
P tmp_left=search(root->left);
P tmp_right=search(root->right);
if(tmp_left.first.first==false || tmp_right.first.first==false)
{
return P(PBI(false,0),PII(0,0));
}
else
{
if(root->val>tmp_left.second.second && root->val<tmp_right.second.first)
{
//判断一下有没有NULL参与
int minn=tmp_left.second.first,maxn=tmp_right.second.second;
if(minn==MAX)
{//left is NULL
minn=root->val;
}//right is NULL
if(maxn==MIN)
{
maxn=root->val;
}
int sum_of_valid_tree=tmp_left.first.second+tmp_right.first.second+root->val;
//printf("::::%d\n",sum_of_valid_tree);
maxsum=max(maxsum,sum_of_valid_tree);
return P(PBI(true,sum_of_valid_tree),PII(minn,maxn));
}
else return P(PBI(false,0),PII(0,0));
}
}
int maxSumBST(TreeNode* root) {
search(root);
return maxsum;
}
};
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了