• 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;
        }
    };
  • 相关阅读:
    毕业设计-角色用户管理
    质因数分解
    高次同余方程
    线性同余方程
    乘法逆元
    约数,整除
    扩展欧几里得算法
    同余
    P2303 [SDOI2012] Longge 的问题
    最大公约数(gcd)与最小公倍数(lcm)
  • 原文地址:https://www.cnblogs.com/zl1991/p/15880105.html
Copyright © 2020-2023  润新知