LeetCode 1373. Maximum Sum BST in Binary Tree

原题链接在这里:https://leetcode.com/problems/maximum-sum-bst-in-binary-tree/description/

题目:

Given a binary tree root, return the maximum sum of all keys of any sub-tree which is also a Binary Search Tree (BST).

Assume a BST is defined as follows:

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • Both the left and right subtrees must also be binary search trees.

Example 1:

Input: root = [1,4,3,2,4,2,5,null,null,null,null,null,null,4,6]
Output: 20
Explanation: Maximum sum in a valid Binary search tree is obtained in root node with key equal to 3.

Example 2:

Input: root = [4,3,null,1,2]
Output: 2
Explanation: Maximum sum in a valid Binary search tree is obtained in a single root node with key equal to 2.

Example 3:

Input: root = [-4,-2,-5]
Output: 0
Explanation: All values are negatives. Return an empty BST.

Constraints:

  • The number of nodes in the tree is in the range [1, 4 * 104].
  • -4 * 104 <= Node.val <= 4 * 104

题解:

Bottom up DFS. 

DFS state needs the current root node.

DFS returns an array with subtree min value, max value and sum. If the subtree is not a BST, then return null.

Check both left and right subtrees returned array are not null and rootval val is within (left substree.max, right subtree. min).

If current node could also be a subtree. update the res.

Note: when return current node subtree min and max, it needs to do Math.min(l[0], root.val) and Math.max(r[1], root.val). Since previous l[0] and r[1] could be Integer.MIN_VALUE or Integer.MAX_VALUE.

Time Complexity: O(n). n is number of nodes in the tree.

Space: O(h). The height of the tree.

AC Java:

 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 res = 0;
18     public int maxSumBST(TreeNode root) {
19         dfs(root);
20         return res;
21     }
22 
23     private int[] dfs(TreeNode root){
24         if(root == null){
25             return new int[]{Integer.MAX_VALUE, Integer.MIN_VALUE, 0};
26         }
27 
28         int[] l = dfs(root.left);
29         int[] r = dfs(root.right);
30         if(l == null || r == null || root.val <= l[1] || root.val >= r[0]){
31             return null;
32         }
33         
34         int total = l[2] + r[2] + root.val;
35         res = Math.max(res, total);
36         int min = Math.min(l[0], root.val);
37         int max = Math.max(r[1], root.val);
38         return new int[]{min, max, total};
39     }
40 }

类似Largest BST Subtree.

posted @ 2024-05-05 23:23  Dylan_Java_NYC  阅读(6)  评论(0编辑  收藏  举报