Leetcode 1373. 二叉搜索子树的最大键值和(困难)

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;
    }
};

 

posted @ 2022-02-10 17:28  鸭子船长  阅读(62)  评论(0编辑  收藏  举报