原题链接在这里:https://leetcode.com/problems/largest-bst-subtree/
题目:
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?
题解:
采用bottom-up的方法,简历新的class, 用来存储
- 当前节点为root的subtree是否是BST
- 若是,最小val 和最大val.
- size是当前subtree的大小.
然后从下到上更新,若是中间过程中size 比 res大,就更新res.
Time Complexity: O(n). 每个点不会访问超过两遍. Space: O(logn). Recursion stack space.
AC Java:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public int largestBSTSubtree(TreeNode root) { 12 int [] res = {0}; 13 helper(root, res); 14 return res[0]; 15 } 16 17 private Node helper(TreeNode root, int [] res){ 18 Node cur = new Node(); 19 if(root == null){ 20 cur.isBST = true; 21 return cur; 22 } 23 Node left = helper(root.left, res); 24 Node right = helper(root.right, res); 25 if(left.isBST && root.val > left.max && right.isBST && root.val < right.min){ 26 cur.isBST = true; 27 cur.min = Math.min(root.val, left.min); 28 cur.max = Math.max(root.val, right.max); 29 cur.size = left.size + right.size + 1; 30 if(cur.size > res[0]){ 31 res[0] = cur.size; 32 } 33 } 34 return cur; 35 } 36 } 37 38 class Node{ 39 boolean isBST; 40 int min; 41 int max; 42 int size; 43 public Node(){ 44 isBST = false; 45 min = Integer.MAX_VALUE; 46 max = Integer.MIN_VALUE; 47 size = 0; 48 } 49 }