1: /**
2: * Definition for a binary tree node.
3: * struct TreeNode {
4: * int val;
5: * TreeNode *left;
6: * TreeNode *right;
7: * TreeNode(int x) : val(x), left(NULL), right(NULL) {}
8: * };
9: */
10: class Solution {
11: public:
12: int largestBSTSubtree(TreeNode* root) {
13: if (root == NULL) return 0;
14: if (root->left == NULL && root->right == NULL) return 1;
15: if (isValidBST(root, NULL, NULL)) return count(root);
16: return max(largestBSTSubtree(root->left), largestBSTSubtree(root->right));
17: }
18: bool isValidBST(TreeNode *root, TreeNode *pre, TreeNode *suc) {
19: if (root == NULL) return true;
20: if (pre && root->val <= pre->val) return false;
21: if (suc && root->val >= suc->val) return false;
22: return isValidBST(root->left, pre, root) && isValidBST(root->right, root, suc);
23: }
24: int count(TreeNode *root) {
25: if (root == NULL) return 0;
26: if (root->left == NULL && root->right == NULL) return 1;
27: return 1 + count(root->left) + count(root->right);
28: }
29: };
The solution above is a top-down one. The top rated solution which follows a down-top way runs at O(n) time since each node only need to be visited once. Will investigate later.