본문 바로가기
알고리즘(C언어)/이것이 자료구조+알고리즘이다(박상현)_자료구조

(17)[Chapter7]최소힙트리_이론,삽입,삭제_코드

by 코잼민 2024. 8. 28.

Chapter7_2_최소힙트리_코드이론.pdf
2.74MB

 

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*+ 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

 

 

위의 코드 출력 장면