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;
    }
}
posted @ 2021-12-27 15:03  Tianyiya  阅读(57)  评论(0)    收藏  举报