来源
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-sum-bst-in-binary-tree
描述
给你一棵以 root 为根的 二叉树 ,请你返回 任意 二叉搜索子树的最大键值和。
二叉搜索树的定义如下:
任意节点的左子树中的键值都 小于 此节点的键值。
任意节点的右子树中的键值都 大于 此节点的键值。
任意节点的左子树和右子树都是二叉搜索树。
题解
/**
* 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 {
int maxSum = 0;
public int maxSumBST(TreeNode root) {
traverse(root);
return maxSum;
}
private int[] traverse(TreeNode root) {
// base case
if (null == root) {
return new int[] {1, Integer.MAX_VALUE, Integer.MIN_VALUE, 0};
}
// 递归计算左右子树
int[] left = traverse(root.left);
int[] right = traverse(root.right);
/******* 后序遍历位置 *******/
int[] res = new int[4];
// 判断以root为根的二叉树是不是BST
if (left[0] == 1 && right[0] == 1 && root.val > left[2] && root.val < right[1]) {
// 以root为根的二叉树是BST
res[0] = 1;
// 计算以root为根的这棵BST的最小值
res[1] = Math.min(left[1], root.val);
// 计算以root为根的这棵BST的最大值
res[2] = Math.max(right[2], root.val);
// 计算以root为根的这棵BST所有节点之和
res[3] = left[3] + right[3] + root.val;
// 更新全局变量
maxSum = Math.max(maxSum, res[3]);
} else {
res[0] = 0;
// 其他值没有必要计算,因为用不到
}
/**************************/
return res;
}
}
复杂度分析:
- 时间复杂度:
- 空间复杂度: