Skip to content

Commit

Permalink
[ADD]
Browse files Browse the repository at this point in the history
  • Loading branch information
jungsae committed Nov 26, 2023
1 parent 0381f76 commit 276c973
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 29 deletions.
Binary file modified Ex0604_DoublyLinkedList/Ex0604_DoublyLinkedList.exe
Binary file not shown.
12 changes: 6 additions & 6 deletions Ex0701_BinaryTree/Ex0701_BinaryTree.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,9 +58,9 @@ int main()
// tree.Postorder();
// cout << endl;

// cout << "LevelOrder" << endl; // 6 2 5 1 4 3
// tree.LevelOrder();
// cout << endl;
cout << "LevelOrder" << endl; // 6 2 5 1 4 3
tree.LevelOrder();
cout << endl;

// cout << "Iterative Preorder" << endl; // 6 2 1 3 5 4
// tree.IterPreorder();
Expand All @@ -70,9 +70,9 @@ int main()
// tree.IterInorder();
// cout << endl;

cout << "Iterative Postorder" << endl; // 3 1 2 4 5 6
tree.IterPostorder();
cout << endl;
// cout << "Iterative Postorder" << endl; // 3 1 2 4 5 6
// tree.IterPostorder();
// cout << endl;

// 트리 소멸자에서 삭제
// delete n1;
Expand Down
Binary file added Ex0701_BinaryTree/Ex0701_BinaryTree.exe
Binary file not shown.
Binary file modified Ex0702_ExpressionTree/Ex0702_ExpressionTree.exe
Binary file not shown.
Binary file not shown.
6 changes: 3 additions & 3 deletions Ex0801_Heap/Ex0801_Heap.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ int main()
// 개념 설명은 트리인데 구현은 배열 (연결 표현법으로도 구현 가능)
// 완전 이진 트리 상태를 유지

// 부모 노드의 값이 두 자식 노드의 값 이상이어야 한다.
// 부모 노드의 값이 두 자식 노드의 값 이상이어야 한다.
// 자식들끼리는 값의 크기 순서 무관. <- 느슨한 정렬 상태
// 중복된 값을 여러개 넣을 수 있음

Expand All @@ -23,7 +23,7 @@ int main()

MaxHeap<int> h;

for (auto i : { 2, 8, 5, 3, 2, 1, 9, 3, 7 })
for (auto i : {2, 8, 5, 3, 2, 1, 9, 3, 7})
{
h.Push(i);
h.Print();
Expand All @@ -34,7 +34,7 @@ int main()
{
cout << h.Top() << " ";
h.Pop();
// h.Print();
h.Print();
}
cout << endl;

Expand Down
Binary file added Ex0801_Heap/Ex0801_Heap.exe
Binary file not shown.
57 changes: 37 additions & 20 deletions shared/MaxHeap.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
#include <iostream>
#include <iomanip>

template<typename T>
template <typename T>
class MaxHeap
{
public:
Expand All @@ -19,9 +19,10 @@ class MaxHeap

void Resize(int new_capacity)
{
T* new_heap = new T[new_capacity];
T *new_heap = new T[new_capacity];
memcpy(new_heap, heap_, sizeof(T) * (size_ + 1)); // +1 주의
if (heap_) delete[] heap_;
if (heap_)
delete[] heap_;
heap_ = new_heap;
capacity_ = new_capacity;
}
Expand All @@ -47,13 +48,14 @@ class MaxHeap
cout << "Value: ";
for (int i = 1; i <= size_; i++)
cout << setw(3) << heap_[i];
cout << endl << endl;
cout << endl
<< endl;
}

void Push(const T& item)
void Push(const T &item)
{
//using namespace std;
//cout << "Push " << item << endl;
using namespace std;
cout << "Push " << item << endl;

if (size_ == capacity_)
Resize(capacity_ * 2);
Expand All @@ -63,15 +65,17 @@ class MaxHeap
size_ += 1;
int current = size_; // 마지막에 추가가될 위치 (인덱스)

while (current != 1 /* && TODO */) // 부모 위치의 값이 추가하려는 값보다 작다면
while (current != 1 && heap_[current / 2] < item) // 부모 위치의 값이 추가하려는 값보다 작다면
{
// 부모 위치의 값을 자식 위치로 복사해서 내린다.
// TODO:
heap_[current] = heap_[current / 2];

//cout << "Current = " << current << endl;
//Print();
cout << "Current = " << current << endl;
Print();

// TODO:
current = current / 2;
}

heap_[current] = item; // 최종적으로 결정된 위치에 복사
Expand All @@ -81,42 +85,55 @@ class MaxHeap
{
assert(!IsEmpty());

//using namespace std;
//cout << "Pop()" << endl;
using namespace std;
cout << "Pop()" << endl;

// heap[1].~T(); // 소멸자 호출
heap_[1].~T(); // 소멸자 호출

// 삭제: 가장 마지막 값을 루트로 옮긴 후에 내려 보낸다.

T last_item = heap_[size_]; // 마지막 아이템 복사
size_--; // 크기 줄이기

int current = 1; // 루트 노드에서 시작
int child = 2; // current * 2 (루트의 왼쪽 자식 인덱스)
int current = 1; // 루트 노드에서 시작
int child = 2; // current * 2 (루트의 왼쪽 자식 인덱스)
while (child <= size_)
{
// left, right 중에서 더 큰 자식의 인덱스를 찾는다. 이때 자식이 하나라면 찾을 필요 없음
// TODO:
// if (heap_[current * 2] && heap_[(current * 2) + 1])
// {
// if (heap_[current * 2] > heap_[(current * 2) + 1])
// child = current * 2;
// else
// child = (current * 2) + 1;
// }
if (child < size_ && heap_[child] < heap_[child + 1])
child++;

// 현재(current) 값이 더 큰 자식의 값 이상이면 더이상 적절한 위치를 찾을 필요가 없기 때문에 루프 중단
// TODO:
if (last_item >= heap_[child])
break;

// 자식 값을 부모 위치로 복사,
// 자식 값을 부모 위치로 복사,
// TOD:
heap_[current] = heap_[child];

//cout << "Current = " << current << ", child = " << child << endl;
//Print();
cout << "Current = " << current << ", child = " << child << endl;
Print();

// 그 자식 위치로 current 인덱스 변경, child 인덱스도 그 다음 자식 위치로 변경
// TODO:
current = child;
child = child * 2;
}

heap_[current] = last_item;
}

private:
T* heap_ = nullptr;
T *heap_ = nullptr;
int size_ = 0;
int capacity_ = 0;
};

0 comments on commit 276c973

Please sign in to comment.