forked from AllAlgorithms/java
-
Notifications
You must be signed in to change notification settings - Fork 0
/
MaxHeap.java
152 lines (122 loc) · 2.55 KB
/
MaxHeap.java
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
139
140
141
142
143
144
145
146
147
148
149
150
151
import java.util.*;
import java.io.*;
abstract class Heap{
protected int capacity;
protected int size;
protected int []items;
public Heap()
{
this.capacity = 10;
this.size = 0;
this.items = new int[capacity];
}
public int getLeftChildIndex(int parentindex){
return 2*parentindex+1;
}
public int getRightChildIndex(int parentindex){
return 2*parentindex+2;
}
public int getParentIndex(int childIndex){
return (childIndex-1)/2;
}
public boolean hasLeftChild(int parentindex)
{
return getLeftChildIndex(parentindex) < size;
}
public boolean hasRightChild(int parentindex)
{
return getRightChildIndex(parentindex) < size;
}
public boolean hasParent(int index){
return getParentIndex(index) >= 0;
}
public int leftChild(int parentindex){
return items[getLeftChildIndex(parentindex)];
}
public int rightChild(int parentindex){
return items[getRightChildIndex(parentindex)];
}
public int parent(int index)
{
return items[getParentIndex(index)];
}
public void swap(int indexone,int indextwo){
int temp = items[indexone];
items[indexone] = items[indextwo];
items[indextwo] = temp;
}
public void add(int item)
{
items[size] = item;
size++;
heapifyUp();
}
public void isEmpty(String name)
{
if(size == 0)
{
System.out.println(name+"cant poll");
}
}
public int poll()
{
isEmpty("its empty");
int item = items[0];
items[0] = items[size-1];
size--;
heapifyDown();
return item;
}
public void print()
{
for(int i=0;i<size;i++)
{
System.out.print(items[i]);
}
}
public abstract void heapifyDown();
public abstract void heapifyUp();
}
class MaxHeap extends Heap
{
public void heapifyDown()
{
int index = 0;
while(hasLeftChild(index)){
int smallerChildIndex = getLeftChildIndex(index);
if(hasRightChild(index) && rightChild(index) > leftChild(index))
{
smallerChildIndex = getRightChildIndex(index);
}
if(items[index] > items[smallerChildIndex])
{
break;
}
else{
swap(index,smallerChildIndex);
}
index = smallerChildIndex;
}
}
public void heapifyUp()
{
int index = size - 1;
while(hasParent(index) && parent(index) < items[index]){
swap(getParentIndex(index),index);
index = getParentIndex(index);
}
}
public static void main(String []args)
{
Scanner ob = new Scanner(System.in);
int n = ob.nextInt();
Heap myHeap = new MaxHeap();
for(int i=0;i<n;i++)
{
myHeap.add(ob.nextInt());
}
myHeap.print();
System.out.println("Element removed:"+myHeap.poll());
myHeap.print();
}
}