Inserting to a heap means adding a new element to the last position, than restoring the heap property, by moving up the tree. The child of a node k in the array is at positions 2k+1 and 2k+2, so moving up the tree is just basic arithmetic.
Deleting from the heap simply means replacing the root (the element at position k 0) with the last element, delete the last element, and restore the heap property.
Without further delays, here's the code.
For insertion:
1: template <class T>
2: void addToHeap(vector<T>* heap, T val) {
3: heap->push_back(val);
4: int pos = heap->size() - 1;
5: if (pos == 0)
6: return;
7: bool fixingHeap = true;
8: do {
9: int parent = 0;
10: if (pos % 2 == 0)
11: parent = (pos - 2) / 2;
12: else
13: parent = (pos - 1) / 2;
14: if (heap->at(parent) < heap->at(pos)) {
15: T temp = heap->at(pos);
16: heap->at(pos) = heap->at(parent);
17: heap->at(parent) = temp;
18: pos = parent;
19: } else {
20: fixingHeap = false;
21: }
22: } while (fixingHeap && pos != 0);
23: }
For deleting:
1: template <class T>
2: T deleteFromHeap(vector<T>* heap) {
3: int size = heap->size();
4: if (size == 0) {
5: return -1;
6: }
7: T ret = heap->front();
8: if (size == 1) {
9: heap->clear();
10: return ret;
11: }
12: if (size == 2) {
13: heap->at(0) = heap->at(size - 1);
14: heap->pop_back();
15: return ret;
16: }
17: heap->at(0) = heap->at(size - 1);
18: heap->pop_back();
19: size--;
20: bool fixingHeap = true;
21: int pos = 0;
22: do {
23: int child1 = 2 * pos + 1;
24: int child2 = 2 * pos + 2;
25: int switchPosition = 0;
26: T max = 0;
27: if (child2 < size) {
28: //2 children
29: if (heap->at(child1) > heap->at(child2)) {
30: switchPosition = child1;
31: max = heap->at(child1);
32: }
33: else {
34: switchPosition = child2;
35: max = heap->at(child2);
36: }
37: if (heap->at(pos) < max) {
38: T temp = heap->at(pos);
39: heap->at(pos) = heap->at(switchPosition);
40: heap->at(switchPosition) = temp;
41: pos = switchPosition;
42: } else {
43: fixingHeap = false;
44: }
45: } else if (child1 < size) {
46: //1 child
47: if (heap->at(pos) < heap->at(child1)) {
48: T temp = heap->at(pos);
49: heap->at(pos) = heap->at(child1);
50: heap->at(child1) = temp;
51: pos = child1;
52: } else {
53: fixingHeap = false;
54: }
55: } else {
56: //0 children;
57: fixingHeap = false;
58: }
59: } while (fixingHeap);
60: return ret;
61: }
No comments:
Post a Comment