333. 最大 BST 子树
给定一个二叉树,找到其中最大的二叉搜索树(BST)子树,并返回该子树的大小。其中,最大指的是子树节点数最多的。
二叉搜索树(BST)中的所有节点都具备以下属性:
左子树的值小于其父(根)节点的值。
右子树的值大于其父(根)节点的值。
注意:
子树必须包含其所有后代。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-bst-subtree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution {
private Info solve(TreeNode root) {
if (root == null) {
return new Info(true, 0, Integer.MAX_VALUE, Integer.MIN_VALUE, 0);
}
Info left = solve(root.left);
Info right = solve(root.right);
boolean ok = left.ok && right.ok && left.mostRight < root.val && right.mostLeft > root.val;
int num = left.num + 1 + right.num;
int mostLeft = Math.min(root.val, left.mostLeft);
int mostRight = Math.max(root.val, right.mostRight);
int ans = Math.max(left.ans, right.ans);
if (ok) {
ans = num;
}
return new Info(ok, num, mostLeft, mostRight, ans);
}
public int largestBSTSubtree(TreeNode root) {
return solve(root).ans;
}
}
class Info {
boolean ok;
int num;
int mostLeft;
int mostRight;
int ans;
public Info(boolean ok, int num, int mostLeft, int mostRight, int ans) {
this.ok = ok;
this.num = num;
this.mostLeft = mostLeft;
this.mostRight = mostRight;
this.ans = ans;
}
}
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;
}
}
心之所向,素履以往 生如逆旅,一苇以航

浙公网安备 33010602011771号