A brute-force approach for Max BST
I've tried this problem before, twice, with no luck. I remember trying an O(N)-time solution, but got wrong answers twice. Decided to go for an N^2 solution, this time it worked. Here is the problem: Largest BST Subtree - LeetCode
Given the root of a binary tree, find the largest subtree, which is also a Binary Search Tree (BST), where the largest means subtree has the largest number of nodes.
A Binary Search Tree (BST) is a tree in which all the nodes follow the below-mentioned properties:
- The left subtree values are less than the value of their parent (root) node's value.
- The right subtree values are greater than the value of their parent (root) node's value.
Note: A subtree must include all of its descendants.
Follow up: Can you figure out ways to solve it with O(n) time complexity?
Example 1:
Input: root = [10,5,15,1,8,null,7] Output: 3 Explanation: The Largest BST Subtree in this case is the highlighted one. The return value is the subtree's size, which is 3.
Example 2:
Input: root = [4,2,7,2,3,5,null,2,null,null,null,null,null,1] Output: 2
Constraints:
- The number of nodes in the tree is in the range
[0, 104]
. -104 <= Node.val <= 104
The approach that I took was an N^2 one:
1/ Create a method that checks whether a given node is the root of a BST. Do it using post-order (in-order only really works if the tree contains only unique elements). This is an O(N)
2/ As part of (1), make it return the number of nodes in the subtree (no extra time added)
3/ Finally call it for each subnode in the tree. Another O(N)
Combined this would be O(N^2). Since N=10000, we're talking about 10^8. I thought it was going to time out - it didn't. Code is below, cheers, ACC.
public int LargestBSTSubtree(TreeNode root) { int retVal = 0; LargestBSTSubtree(root, ref retVal); return retVal; } private void LargestBSTSubtree(TreeNode node, ref int maxNodes) { if (node == null) return; int max = Int32.MinValue; int min = Int32.MaxValue; int numberNodes = 0; if (IsBST(node, ref max, ref min, ref numberNodes)) { maxNodes = Math.Max(maxNodes, numberNodes); } LargestBSTSubtree(node.left, ref maxNodes); LargestBSTSubtree(node.right, ref maxNodes); } private bool IsBST(TreeNode node, ref int max, ref int min, ref int numberNodes) { if (node == null) return true; int leftMax = Int32.MinValue; int leftMin = Int32.MaxValue; int leftNumberNodes = 0; if (!IsBST(node.left, ref leftMax, ref leftMin, ref leftNumberNodes)) return false; int rightMax = Int32.MinValue; int rightMin = Int32.MaxValue; int rightNumberNodes = 0; if (!IsBST(node.right, ref rightMax, ref rightMin, ref rightNumberNodes)) return false; if (leftMax >= node.val) return false; if (rightMin <= node.val) return false; max = node.val; max = Math.Max(max, leftMax); max = Math.Max(max, rightMax); min = node.val; min = Math.Min(min, leftMin); min = Math.Min(min, rightMin); numberNodes = 1 + leftNumberNodes + rightNumberNodes; return true; }
Comments
Post a Comment