forked from DengWangBao/Leetcode-Java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
LargestBSTSubtree.java
39 lines (31 loc) · 1.03 KB
/
LargestBSTSubtree.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class LargestBSTSubtree {
class Result {
int count;
int lower;
int upper;
Result(int count, int lower, int upper) {
this.count = count;
this.lower = lower;
this.upper = upper;
}
}
int max = 0;
public int largestBSTSubtree(TreeNode root) {
helper(root);
return max;
}
private Result helper(TreeNode root) {
if (root == null) {
return new Result(0, Integer.MAX_VALUE, Integer.MIN_VALUE);
}
Result left = helper(root.left);
Result right = helper(root.right);
// 注意这里的等号千万别掉了,因为可能树中有节点相同
if (left.count < 0 || right.count < 0 || left.upper >= root.val || right.lower <= root.val) {
return new Result(-1, 0, 0);
}
int size = left.count + 1 + right.count;
max = Math.max(size, max);
return new Result(size, Math.min(left.lower, root.val), Math.max(right.upper, root.val));
}
}