333. Largest BST Subtree

来源:互联网 发布:广联达软件安装 编辑:程序博客网 时间:2024/05/20 06:25

Given a binary tree, find the largest subtree which is a Binary Search Tree (BST), where largest means subtree with largest number of nodes in it.

Note:
A subtree must include all of its descendants.
Here's an example:

    10    / \   5  15  / \   \  1   8   7
The Largest BST Subtree in this case is the highlighted one. 
The return value is the subtree's size, which is 3. 

Follow up:
Can you figure out ways to solve it with O(n) time complexity?

递归解题。对于整个数的每一个节点,判断当前节点子树是不是一个BST,是个话返回节点个数,不是的话返回左右子树的最大BST子树节点个数。代码如下:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */public class Solution {    public int largestBSTSubtree(TreeNode root) {        if (root == null) {            return 0;        }                if (root.left == null && root.right == null) {            return 1;        }        if (isValid(root, null, null)) {            return countNode(root);        }        return Math.max(largestBSTSubtree(root.left), largestBSTSubtree(root.right));    }        private boolean isValid(TreeNode root, TreeNode min, TreeNode max) {        if (root == null) {            return true;        }        if (min != null && min.val >= root.val) {            return false;        }        if (max != null && max.val <= root.val) {            return false;        }        boolean valid = (isValid(root.left, min, root) && isValid(root.right, root, max));        return valid;    }        private int countNode(TreeNode root) {        if (root == null) {            return 0;        }        if (root.left == null && root.right == null) {            return 1;        }        return 1 + countNode(root.left) + countNode(root.right);    }}

原创粉丝点击