-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBinaryHeap.java
More file actions
138 lines (119 loc) · 2.65 KB
/
BinaryHeap.java
File metadata and controls
138 lines (119 loc) · 2.65 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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
public class BinaryHeap implements Minheap{
int shift,sizecount;
TreeNode[] heap;
public BinaryHeap() {
shift=0;
heap=new TreeNode[1000004];
sizecount=shift;
}
@Override
public void buildHeap(int[] freqArray) {
if(freqArray==null) return;
//fill the heap of TreeNode array
for(int i=0;i<freqArray.length;i++){
if(freqArray[i]>0){
heap[sizecount++]=new TreeNode(i,freqArray[i]);
}
}
// if there is atleast one element inserted in the heap array, then take care of the sizecount, which we increment
if(sizecount>shift)
sizecount--;
// min heapify from the child
for(int i=parent_Of_I(sizecount);i>=shift;i--){
minHeapify(i);
}
}
@Override
public TreeNode extractMin() {
if(sizecount<shift) return null;
TreeNode temp=heap[shift];
heap[shift]=heap[sizecount];
heap[sizecount]=null;
sizecount--;
minHeapify(shift);
return temp;
}
@Override
public void minHeapify(int index) {
int minChild=getMinChild(index);
if(minChild==index) return;
else{
TreeNode temp=heap[index];
heap[index]=heap[minChild];
heap[minChild]=temp;
minHeapify(minChild);
}
}
@Override
public void decreaseKey(int index, int newFreq) {
// TODO Auto-generated method stub
if(heap[index].freq<newFreq) return;
int parentofi=parent_Of_I(index);
heap[index].freq=newFreq;
TreeNode temp;
while(parentofi >= shift && heap[parentofi].freq>heap[index].freq){
temp=heap[parentofi];
heap[parentofi]=heap[index];
heap[index]=temp;
index=parentofi;
parentofi=parent_Of_I(index);
}
}
@Override
public TreeNode getMin() {
if(sizecount>=shift){
return heap[shift];
}
return null;
}
@Override
public int parent_Of_I(int i) {
// TODO Auto-generated method stub
return ((i+1)/2)-1;
}
@Override
public int child_I_Of_J(int i, int j) {
// ith child of j
return 2*(j+1)+i-1;
}
@Override
public int getMinChild(int index) {
int smallest=index;
for(int i=0;i<2;i++){
if(child_I_Of_J(i,index)<=sizecount){
if(heap[child_I_Of_J(i,index)].freq<heap[smallest].freq){
smallest=child_I_Of_J(i, index);
}
}
}
return smallest;
}
@Override
public TreeNode[] getHeapRef() {
// TODO Auto-generated method stub
return heap;
}
@Override
public int getShift() {
// TODO Auto-generated method stub
return shift;
}
@Override
public void setRoot(TreeNode minNode) {
// TODO Auto-generated method stub
heap[shift]=minNode;
minHeapify(shift);
}
@Override
public int getSizeCount() {
// TODO Auto-generated method stub
return sizecount;
}
@Override
public TreeNode getRoot() {
if(sizecount>=shift){
return heap[shift];
}
return null;
}
}