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
152
153
|
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
#pragma warning (disable : 4996)
//힙트리 구조체
typedef int EType;
typedef struct _HeapNode
{
EType heap[MAX_SIZE];
int size;
}Heap;
//구조체 생성, 초기화 메소드
Heap* CreateHeap(Heap* H)
{
H = (Heap*)malloc(sizeof(Heap));
H->size = 0;
return H;
}
//해당 인덱스 대입 시, 부모, 왼자, 오른자 인덱스 반환 메소드
int Parent(int i)
{
return (i - 1) / 2;
}
int LeftChild(int i)
{
return (2*i + 1);
}
int RightChild(int i)
{
return (2 * i + 2);
}
//힙트리 노드 삽입 메소드(최소힙)
void InsertHeap(Heap* H , EType data)
{
//예외 조건 : 힙트리가 가득 찼다면,
if (H->size == MAX_SIZE)
{
printf("Heap Full!!\n");
return;
}
//★맨 마지막 인덱스 임시 저장 후, 유효사이즈 증감
int i = H->size++;
H->heap[i] = data;
while ((i>0)&&(H->heap[i]<H->heap[Parent(i)]))
{
EType tmp = H->heap[i];
H->heap[i] = H->heap[Parent(i)];
H->heap[Parent(i)]=tmp;
i = Parent(i);
}
return;
}
//최소힙 제거 메소드
int DeleteHeap(Heap* H)
{
//예외 조건 : 유효개수 0, 1개일 경우
if (H->size == 0)
{
printf("Heap empty!!\n");
return -1;
}
else if (H->size == 1)
{
//유효개수 감소후
H->size--;
return H->heap[0];
}
//root노드 반환용 변수에 저장
int root = H->heap[0];
//root노드에 마지막 노드값 저장, 유효개수 차감
H->heap[0] = H->heap[--H->size];
int i = 0;
while (1)
{
//삼각형으로 각 인덱스 초기화
int smallest = i;
int L = LeftChild(i);
int R = RightChild(i);
//판단 순서 : smallest => L => R
if ((H->heap[L] < H->heap[smallest]) && (L < H->size))
{
smallest = L;
}
if ((H->heap[R] < H->heap[smallest]) && (R < H->size))
{
smallest = R;
}
//smallest자리 변화x => 멈춤
if (smallest == i) break;
//smallest와 i와 SWAP
EType tmp = H->heap[smallest];
H->heap[smallest] = H->heap[i];
H->heap[i] = tmp;
//smallest자리 i 업데이트
i = smallest;
}
//제거된 값 반환
return root;
}
void PrintHeap(Heap* H) {
printf("MinHeap : ");
for (int i = 0; i < H->size; i++) {
printf("%d ", H->heap[i]);
}
printf("\n");
}
int main() {
Heap *H=NULL;
H=CreateHeap(H);
InsertHeap(H, 3);
InsertHeap(H, 1);
InsertHeap(H, 6);
InsertHeap(H, 5);
InsertHeap(H, 2);
InsertHeap(H, 4);
PrintHeap(H);
printf("Deleted root: %d\n", DeleteHeap(H));
PrintHeap(H);
return 0;
}
|
cs |
'알고리즘(C언어) > 이것이 자료구조+알고리즘이다(박상현)_자료구조' 카테고리의 다른 글
(18)[Chapter7]우선순위 큐와힙트리_이론+코드 (1) | 2024.08.28 |
---|---|
(16)[Chapter7]최소힙트리_이론,삽입,삭제_노트정리 (0) | 2024.08.27 |
(15)[Chapter6]AVL 트리_삭제 메소드(작성중) (0) | 2024.08.04 |
(14)[Chapter6]AVL 트리_삽입 메소드 (0) | 2024.08.03 |
(13)[Chapter6]이진 탐색 트리_삭제 메소드_비재귀/재귀(이론 + 코드) (5) | 2024.07.25 |