每日一题 1373二叉搜索子树的最大键值和(后序遍历)

题目

给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。

二叉搜索树的定义如下:

任意节点的左子树中的键值都 小于 此节点的键值。

任意节点的右子树中的键值都 大于 此节点的键值。

任意节点的左子树和右子树都是二叉搜索树。

示例 1:

输入:root = [1,4,3,2,4,2,5,null,null,null,null,null,null,4,6]

输出:20

解释:键值为 3 的子树是和最大的二叉搜索树。

示例 2:

输入:root = [4,3,null,1,2]

输出:2

解释:键值为 2 的单节点子树是和最大的二叉搜索树。

示例 3:

输入:root = [-4,-2,-5]

输出:0

解释:所有节点键值都为负数,和最大的二叉搜索树为空。

示例 4:

输入:root = [2,1,3]

输出:6

示例 5:

输入:root = [5,4,8,3,null,6,3]

输出:7

题解

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    private int ans;
    public int maxSumBST(TreeNode root) {
        dfs(root);
        return ans;
    }
    private int[] dfs(TreeNode root) {
        // root为空返回【正无穷,负无穷,第三个数(随意)】
        if (root == null) {
            return new int[]{Integer.MAX_VALUE,Integer.MIN_VALUE,0};
        }
        int[] left = dfs(root.left);
        int[] right = dfs(root.right);
        int x = root.val;
        // 不是搜索树
        if (x <= left[1] || x >= right[0]) {
            return new int[]{Integer.MIN_VALUE,Integer.MAX_VALUE,0};
        }
        // 结点值的和
        int sum = left[2] + right[2] + x;
        ans = Math.max(ans, sum);
        // 返回结点的范围
        return new int[]{Math.min(left[0],x),Math.max(right[1],x),sum};
    }
}
相关推荐
Han.miracle15 分钟前
数据结构——二叉树的从前序与中序遍历序列构造二叉树
java·数据结构·学习·算法·leetcode
Le1Yu1 小时前
分布式事务以及Seata(XA、AT模式)
java
寒山李白2 小时前
关于Java项目构建/配置工具方式(Gradle-Groovy、Gradle-Kotlin、Maven)的区别于选择
java·kotlin·gradle·maven
mit6.8242 小时前
前后缀分解
算法
独自破碎E3 小时前
判断链表是否为回文
数据结构·链表
你好,我叫C小白3 小时前
C语言 循环结构(1)
c语言·开发语言·算法·while·do...while
无妄无望3 小时前
docker学习(4)容器的生命周期与资源控制
java·学习·docker
MC丶科3 小时前
【SpringBoot 快速上手实战系列】5 分钟用 Spring Boot 搭建一个用户管理系统(含前后端分离)!新手也能一次跑通!
java·vue.js·spring boot·后端
千码君20163 小时前
React Native:从react的解构看编程众多语言中的解构
java·javascript·python·react native·react.js·解包·解构
夜白宋4 小时前
【word多文档docx合并】
java·word