ccoommmmiitt 33 iinn ccpppp
This commit is contained in:
1 parent
32af7721e0
commit
5ebfed9781
5 files changed
+269
-83
No files matched your search
+81
-66
@@ -1,102 +1,117 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <cmath>
|
||||
|
||||
int log2int(int n){
|
||||
if (n <= 1){
|
||||
return 0; // no support + n is int anyway
|
||||
}
|
||||
return 1 + log2int(n / 2);
|
||||
}
|
||||
class binary_tree
|
||||
{
|
||||
public:
|
||||
binary_tree() {}
|
||||
|
||||
void append(int x)
|
||||
{
|
||||
data.push_back(x);
|
||||
maintain_shape(0);
|
||||
bubble_up(data.size() - 1);
|
||||
}
|
||||
void maintain_shape(int ind)
|
||||
|
||||
void add(std::vector<int> add)
|
||||
{
|
||||
int left = 2 * ind + 1;
|
||||
int right = 2 * ind + 2; // damn this is accounted for 0 indexing gj ai
|
||||
if (left > data.size())
|
||||
{ // 100% leaf
|
||||
return;
|
||||
for (int x : add)
|
||||
{
|
||||
append(x);
|
||||
}
|
||||
if (right > data.size())
|
||||
{ // only node is left, and that node is also last ele in data
|
||||
if (data[ind] < data[left])
|
||||
{
|
||||
std::swap(data[ind], data[left]); // bigger higher
|
||||
}
|
||||
return;
|
||||
}
|
||||
maintain_shape(left);
|
||||
maintain_shape(right);
|
||||
// ordering? so the last item at index data.size() - 1 isnt swapped last: may lead to problem??? idk
|
||||
if (data[ind] < data[left])
|
||||
std::swap(data[ind], data[left]);
|
||||
if (data[ind] < data[right])
|
||||
std::swap(data[ind], data[right]);
|
||||
}
|
||||
int pop() {
|
||||
|
||||
int pop()
|
||||
{
|
||||
if (data.empty())
|
||||
throw std::runtime_error("Heap is empty");
|
||||
int ret = data[0];
|
||||
data[0] = data[data.size() - 1];
|
||||
data[0] = data.back();
|
||||
data.pop_back();
|
||||
maintain_shape(0);
|
||||
if (!data.empty())
|
||||
sift_down(0);
|
||||
return ret;
|
||||
}
|
||||
void add(std::vector<int> add) {
|
||||
for (int i = 0; i < add.size(); i++) {
|
||||
data.push_back(add[i]);
|
||||
}
|
||||
maintain_shape(0);
|
||||
}
|
||||
void print() {
|
||||
// insane sauce:
|
||||
int twos = 0;
|
||||
|
||||
for (int i = 0; i < data.size(); i++) {
|
||||
if (log2int(i + 1) == twos + 1) {
|
||||
std::cout << std::endl;
|
||||
twos++;
|
||||
}
|
||||
void print()
|
||||
{
|
||||
int levels = 0;
|
||||
for (int i = 0; i < data.size(); i++)
|
||||
{
|
||||
if (log2int(i + 1) == levels + 1)
|
||||
{
|
||||
std::cout << "\n";
|
||||
levels++;
|
||||
}
|
||||
std::cout << data[i] << " ";
|
||||
}
|
||||
std::cout << std::endl;
|
||||
std::cout << "\n";
|
||||
}
|
||||
|
||||
private:
|
||||
std::vector<int> data;
|
||||
};
|
||||
|
||||
int log2int(int n)
|
||||
{
|
||||
int log = 0;
|
||||
while (n > 1)
|
||||
{
|
||||
n /= 2;
|
||||
log++;
|
||||
}
|
||||
return log;
|
||||
}
|
||||
|
||||
void bubble_up(int idx)
|
||||
{
|
||||
while (idx > 0)
|
||||
{
|
||||
int parent = (idx - 1) / 2;
|
||||
if (data[parent] >= data[idx])
|
||||
break;
|
||||
std::swap(data[parent], data[idx]);
|
||||
idx = parent;
|
||||
}
|
||||
}
|
||||
|
||||
void sift_down(int idx)
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
int left = 2 * idx + 1;
|
||||
int right = 2 * idx + 2;
|
||||
int largest = idx;
|
||||
|
||||
if (left < data.size() && data[left] > data[largest])
|
||||
largest = left;
|
||||
if (right < data.size() && data[right] > data[largest])
|
||||
largest = right;
|
||||
|
||||
if (largest == idx)
|
||||
break;
|
||||
|
||||
std::swap(data[idx], data[largest]);
|
||||
idx = largest;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char const *argv[])
|
||||
{
|
||||
binary_tree bt;
|
||||
bt.append(1);
|
||||
bt.append(2);
|
||||
bt.append(6);
|
||||
std::cout << "\n";
|
||||
bt.print();
|
||||
bt.append(4);
|
||||
bt.append(10);
|
||||
bt.append(20);
|
||||
bt.append(5);
|
||||
std::cout << "\n";
|
||||
bt.print();
|
||||
bt.append(9);
|
||||
std::cout << "\n";
|
||||
bt.print();
|
||||
bt.append(8);
|
||||
std::cout << "\n";
|
||||
bt.append(6);
|
||||
bt.append(15);
|
||||
bt.print();
|
||||
|
||||
int popped = bt.pop();
|
||||
std::cout << "popped: " << popped << std::endl;
|
||||
std::cout << "Popped: " << popped << "\n";
|
||||
bt.print();
|
||||
popped = bt.pop();
|
||||
std::cout << "popped: " << popped << std::endl;
|
||||
bt.print();
|
||||
bt.add({6,5,11, 8, 10,15,3,7,1,12,4, 9});
|
||||
std::cout << "\n";
|
||||
|
||||
bt.add({50, 40, 60});
|
||||
bt.print();
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in new issue
Block a user