-
Notifications
You must be signed in to change notification settings - Fork 15
Expand file tree
/
Copy pathProblem_15.java
More file actions
75 lines (62 loc) · 2 KB
/
Copy pathProblem_15.java
File metadata and controls
75 lines (62 loc) · 2 KB
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
package trees.binarySearchTree;
// Problem Title -> Find median of Bst in O(n) time and O(1) space
public class Problem_14 {
// A binary tree node
static class Node {
int data;
Node left, right;
Node(int item) {
data = item;
left = right = null;
}
}
Node root;
static int count = 0;
// Function to count nodes in BST
static int countNodes(Node node) {
if (node == null) {
return 0;
}
return countNodes(node.left) + countNodes(node.right) + 1;
}
// Function to find median of BST
static void findMedianUtil(Node node, int n, int[] currCount, Integer[] prev, Double[] median) {
if (node == null || median[0] != null) {
return;
}
// Traverse the left subtree
findMedianUtil(node.left, n, currCount, prev, median);
// Increment count of visited nodes
currCount[0]++;
// If n is odd
if (n % 2 != 0 && currCount[0] == (n + 1) / 2) {
median[0] = (double) node.data;
return;
}
// If n is even
else if (n % 2 == 0 && currCount[0] == (n / 2) + 1) {
median[0] = (prev[0] + node.data) / 2.0;
return;
}
// Store previous node data
prev[0] = node.data;
// Recur for right subtree
findMedianUtil(node.right, n, currCount, prev, median);
}
// Wrapper over findMedianUtil()
static Double findMedian(Node root) {
int n = countNodes(root);
int[] currCount = {0};
Integer[] prev = {null};
Double[] median = {null};
findMedianUtil(root, n, currCount, prev, median);
return median[0];
}
// Driver method to test above methods
public static void main(String args[]) {
Problem_14 tree = new Problem_14();
tree.root = new Node(50);
tree.root.left = new Node(30);
tree.root.right = new Node(70);
tree.root.left.left = new Node(20);
}