【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;
    }
};
posted @   Tsyxxxka  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
levels of contents
点击右上角即可分享
微信分享提示