来源

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-sum-bst-in-binary-tree

描述

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

任意节点的左子树中的键值都 小于 此节点的键值。
任意节点的右子树中的键值都 大于 此节点的键值。
任意节点的左子树和右子树都是二叉搜索树。

题解

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. class Solution {
  17. int maxSum = 0;
  18. public int maxSumBST(TreeNode root) {
  19. traverse(root);
  20. return maxSum;
  21. }
  22. private int[] traverse(TreeNode root) {
  23. // base case
  24. if (null == root) {
  25. return new int[] {1, Integer.MAX_VALUE, Integer.MIN_VALUE, 0};
  26. }
  27. // 递归计算左右子树
  28. int[] left = traverse(root.left);
  29. int[] right = traverse(root.right);
  30. /******* 后序遍历位置 *******/
  31. int[] res = new int[4];
  32. // 判断以root为根的二叉树是不是BST
  33. if (left[0] == 1 && right[0] == 1 && root.val > left[2] && root.val < right[1]) {
  34. // 以root为根的二叉树是BST
  35. res[0] = 1;
  36. // 计算以root为根的这棵BST的最小值
  37. res[1] = Math.min(left[1], root.val);
  38. // 计算以root为根的这棵BST的最大值
  39. res[2] = Math.max(right[2], root.val);
  40. // 计算以root为根的这棵BST所有节点之和
  41. res[3] = left[3] + right[3] + root.val;
  42. // 更新全局变量
  43. maxSum = Math.max(maxSum, res[3]);
  44. } else {
  45. res[0] = 0;
  46. // 其他值没有必要计算,因为用不到
  47. }
  48. /**************************/
  49. return res;
  50. }
  51. }

复杂度分析:

  • 时间复杂度:1373. 二叉搜索子树的最大键值和 - 图1
  • 空间复杂度:1373. 二叉搜索子树的最大键值和 - 图2