来源
来源:力扣(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 caseif (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为根的二叉树是不是BSTif (left[0] == 1 && right[0] == 1 && root.val > left[2] && root.val < right[1]) {// 以root为根的二叉树是BSTres[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;}}
复杂度分析:
- 时间复杂度:
- 空间复杂度:
