-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy pathDesignMinHeap.java
More file actions
119 lines (98 loc) · 3.13 KB
/
DesignMinHeap.java
File metadata and controls
119 lines (98 loc) · 3.13 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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Time Complexity : O(log n) for insert, remove
// Space Complexity : O(n) to store n elements
// Any problem you faced while coding this : no
// Your code here along with comments explaining your approach
/*
Use an array to store the incoming elements. To get parent, its i-1/2, to get left & right children, its
2*n+1 and 2*n+2,make sure to keep check of size value and doesnt cross maxSize.The logic of heapify is
that for any input, as long as its not a leaf, check if the left and right children are smaller than the
input, if so, swap them with the input and heapify recursively until smallest element stays at top. For
insert and rmeove methods as well, make sure to heapify and check smallest element is at the top.
*/
class MyMinHeap {
private int Heap[];
private int size;
private int maxSize;
public MyMinHeap(int capacity) {
this.maxSize = capacity;
this.size = 0;
this.Heap = new int[capacity];
}
private int parent(int i) {
return (i - 1) / 2;
}
private int leftChild(int i) {
return (2 * i) + 1;
}
private int rightChild(int i) {
return (2 * i) + 2;
}
private boolean isLeaf(int i) {
return i >= size / 2 && i < size;
}
private void swap(int i, int j) {
int temp = Heap[i];
Heap[i] = Heap[j];
Heap[j] = temp;
}
private void heapify(int i) {
if(isLeaf(i))
return;
int leftChild = leftChild(i);
int rightChild = rightChild(i);
int smallest = i;
if(leftChild > 0 && Heap[leftChild] < Heap[smallest])
smallest = leftChild;
if(rightChild > 0 && Heap[rightChild] < Heap[smallest])
smallest = rightChild;
if(smallest != i) {
swap(smallest, i);
heapify(smallest);
}
}
public void insert(int val) {
if(size >= maxSize)
return;
Heap[size] = val;
int curr = size;
size++;
while(curr > 0 && Heap[curr] < Heap[parent(curr)]) {
swap(curr, parent(curr));
curr = parent(curr);
}
}
public int removeMin() {
if(size == 0)
return -1;
int min = Heap[0];
Heap[0] = Heap[size - 1];
size--;
heapify(0);
return min;
}
public void printHeap() {
for (int i = 0; i <= (size - 2) / 2; i++) {
System.out.print("PARENT: " + Heap[i]);
if (leftChild(i) < size)
System.out.print(" LEFT: " + Heap[leftChild(i)]);
if (rightChild(i) < size)
System.out.print(" RIGHT: " + Heap[rightChild(i)]);
System.out.println();
}
}
public static void main(String[] args) {
MyMinHeap heap = new MyMinHeap(15);
heap.insert(5);
heap.insert(3);
heap.insert(17);
heap.insert(10);
heap.insert(84);
heap.insert(19);
heap.insert(6);
heap.insert(22);
heap.insert(9);
System.out.println("Min Heap:");
heap.printHeap();
System.out.println("Removed Min: " + heap.removeMin());
}
}