二叉搜索子树的最大键值和
力扣链接:1373. 二叉搜索子树的最大键值和
题目描述
给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。
二叉搜索树的定义如下:
任意节点的左子树中的键值都 小于 此节点的键值。
任意节点的右子树中的键值都 大于 此节点的键值。
任意节点的左子树和右子树都是二叉搜索树。
示例
输入:root = [1,4,3,2,4,2,5,null,null,null,null,null,null,4,6]
输出:20
解释:键值为 3 的子树是和最大的二叉搜索树。
示例 3:
输入:root = [-4,-2,-5]
输出:0
解释:所有节点键值都为负数,和最大的二叉搜索树为空。
Java代码
class Solution {
//全局变量,记录 BST 最大节点之和
int maxSum = 0;
public int maxSumBST(TreeNode root) {
dfs(root);
return maxSum;
}
public int[] dfs(TreeNode root) {
if(root == null) {
return new int[]{1, Integer.MAX_VALUE, Integer.MIN_VALUE, 0};
}
int[] left = dfs(root.left);
int[] right = dfs(root.right);
int[] res = new int[4];
/**
* res[0] 记录以 root 为根的二叉树是否是 BST,若为1则说明是 BST,若为0则说明不是 BST
* res[1] 记录以 root 为根的二叉树所有节点中的最小值
* res[2] 记录以 root 为根的二叉树所有节点中的最大值
* res[3] 记录以 root 为根的二叉树所有节点值之和
*/
if(left[0] == 1 && right[0] == 1 && root.val > left[2] && root.val < right[1]) {
//这个 if 在判断以 root 为根的二叉树是不是 BST
//BST的根节点是大于左子树的最大值,小于右子树的最小值
res[0] = 1;
res[1] = Math.min(left[1], root.val);
res[2] = Math.max(right[2], root.val);
res[3] = left[3] + right[3] + root.val;
//计算以 root 为根的这棵 BST 所有节点之和
maxSum = Math.max(maxSum, res[3]);
}else {
//以 root 为根的二叉树不是 BST
res[0] = 0;
}
return res;
}
}
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-sum-bst-in-binary-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。