부모와 자식 노드간 값 비교 부분의 부등호만 서로 반대
class MinHeap {
ArrayList<Integer> heap;
public MinHeap() {
this.heap = new ArrayList<>();
this.heap.add(0);
}
public void insert(int data) {
this.heap.add(data);
int curIdx = heap.size() - 1;
while (curIdx > 1 && this.heap.get(curIdx / 2) > this.heap.get(curIdx)) {
int parent = this.heap.get(curIdx / 2);
this.heap.set(curIdx / 2, data);
this.heap.set(curIdx, parent);
curIdx /= 2;
}
}
public Integer delete() {
if (this.heap.size() == 1) {
System.out.println("The matrix is already empty");
return null;
}
int tar = this.heap.get(1);
int lastIdx = heap.size() - 1;
this.heap.set(1, this.heap.get(lastIdx));
this.heap.remove(lastIdx);
int curIdx = 1;
while (true) {
int leftIdx = curIdx * 2;
int rightIdx = curIdx * 2 + 1;
int tarIdx = -1;
if (rightIdx < heap.size()) {
tarIdx = this.heap.get(leftIdx) < this.heap.get(rightIdx) ? leftIdx : rightIdx;
} else if (leftIdx < heap.size()) {
tarIdx = leftIdx;
} else {
break;
}
if (this.heap.get(curIdx) < this.heap.get(tarIdx)) {
break;
} else {
int parent = this.heap.get(curIdx);
this.heap.set(curIdx, this.heap.get(tarIdx));
this.heap.set(tarIdx, parent);
curIdx = tarIdx;
}
}
return tar;
}
public void print() {
for (int i = 1; i < this.heap.size(); i++) {
System.out.print(this.heap.get(i) + " ");
}
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
MinHeap minHeap = new MinHeap();
minHeap.insert(30);
minHeap.insert(40);
minHeap.insert(10);
minHeap.print();
minHeap.insert(50);
minHeap.insert(60);
minHeap.insert(70);
minHeap.print();
minHeap.insert(20);
minHeap.insert(30);
minHeap.print();
System.out.println("===== 삭제 =====");
System.out.println("삭제: " + minHeap.delete());
minHeap.print();
System.out.println("삭제: " + minHeap.delete());
minHeap.print();
}
}
class MaxHeap {
ArrayList<Integer> heap;
public MaxHeap() {
this.heap = new ArrayList<>();
this.heap.add(0);
}
public void insert(int data) {
this.heap.add(data);
int curIdx = heap.size() - 1;
while (curIdx > 1 && this.heap.get(curIdx / 2) < this.heap.get(curIdx)) {
int parent = this.heap.get(curIdx / 2);
this.heap.set(curIdx / 2, data);
this.heap.set(curIdx, parent);
curIdx /= 2;
}
}
public Integer delete() {
if (this.heap.size() == 1) {
System.out.println("The matrix is already empty");
return null;
}
int tar = this.heap.get(1);
int lastIdx = heap.size() - 1;
this.heap.set(1, this.heap.get(lastIdx));
this.heap.remove(lastIdx);
int curIdx = 1;
while (true) {
int leftIdx = curIdx * 2;
int rightIdx = curIdx * 2 + 1;
int tarIdx = -1;
if (rightIdx < heap.size()) {
tarIdx = this.heap.get(leftIdx) > this.heap.get(rightIdx) ? leftIdx : rightIdx;
} else if (leftIdx < heap.size()) {
tarIdx = leftIdx;
} else {
break;
}
if (this.heap.get(curIdx) > this.heap.get(tarIdx)) {
break;
} else {
int parent = this.heap.get(curIdx);
this.heap.set(curIdx, this.heap.get(tarIdx));
this.heap.set(tarIdx, parent);
curIdx = tarIdx;
}
}
return tar;
}
public void print() {
for (int i = 1; i < this.heap.size(); i++) {
System.out.print(this.heap.get(i) + " ");
}
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
MaxHeap maxHeap = new MaxHeap();
maxHeap.insert(30);
maxHeap.insert(40);
maxHeap.insert(10);
maxHeap.print();
maxHeap.insert(50);
maxHeap.insert(60);
maxHeap.insert(70);
maxHeap.print();
maxHeap.insert(20);
maxHeap.insert(30);
maxHeap.print();
System.out.println("===== 삭제 =====");
System.out.println("삭제: " + maxHeap.delete());
maxHeap.print();
System.out.println("삭제: " + maxHeap.delete());
maxHeap.print();
}
}