-
Notifications
You must be signed in to change notification settings - Fork 1
/
Largest_BST.cpp
83 lines (76 loc) · 1.89 KB
/
Largest_BST.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*
Problem Statement:
------------------
Given a binary tree. Find the size of its largest subtree that is a Binary Search Tree.
Example 1:
---------
Input:
1
/ \
4 4
/ \
6 8
Output: 1
Explanation: There's no sub-tree with size greater than 1 which forms a BST. All the leaf Nodes are the BSTs with size equal to 1.
Example 2:
---------
Input: 6 6 3 N 2 9 3 N 8 8 2
6
/ \
6 3
\ / \
2 9 3
\ / \
8 8 2
Output: 2
Explanation: The following sub-tree is a BST of size 2:
2
/ \
N 8
Your Task: You don't need to read input or print anything. Your task is to complete the function largestBst() that takes the root node of the Binary
Tree as its input and returns the size of the largest subtree which is also the BST. If the complete Binary Tree is a BST, return the size of the complete Binary Tree.
Expected Time Complexity: O(N).
Expected Auxiliary Space: O(Height of the BST).
*/
// Link --> https://practice.geeksforgeeks.org/problems/largest-bst/1#
// Code:
struct node1
{
int isbst;
int size;
int mn;
int mx;
};
struct node1 bst(struct Node *root)
{
struct node1 x;
if (root == NULL)
{
x.isbst = 1;
x.size = 0;
x.mn = 1000000;
x.mx = 0;
return x;
}
struct node1 left = bst(root->left);
struct node1 right = bst(root->right);
if (left.isbst == 1 && right.isbst == 1 && root->data > left.mx && root->data < right.mn)
{
x.isbst = 1;
x.size = 1 + left.size + right.size;
x.mx = max(root->data, right.mx);
x.mn = min(root->data, left.mn);
}
else
{
x.isbst = 0;
x.size = max(left.size, right.size);
x.mn = 1000000;
x.mx = 0;
}
return x;
};
int largestBst(Node *root)
{
return bst(root).size;
}