JUNGLE 240415 ~ 240417 (W04)
KRAFTON JUNGLE Week 04
1. Keywords
포인터 (Pointer)
int*
:int
형에 대한 포인터int* const
:int
형 상수에 대한 포인터 (상수 변경 X)const int*
:int
형에 대한 포인터 상수 (포인터 변경 X)const int* const
: 상수를 가리키는 상수 포인터void*
: 어떤 형식의 데이터도 가리킬 수 있는 포인터
BST에서의 삭제
BSTNode* removeNodeFromTree(BSTNode *root, int value)
{
/* add your code here */
// 1. 트리가 비어있다면 NULL 반환
if (root == NULL)
return NULL;
// 2. 삭제할 노드 탐색 (재귀)
if (value < root->item) {
root->left = removeNodeFromTree(root->left, value);
}
else if (value > root->item) {
root->right = removeNodeFromTree(root->right, value);
}
// 3. 삭제할 노드 찾았으면,
else {
// 3-1. 삭제할 노드의 자식이 없으면 걍 삭제 ㄱ
if (root->left == NULL && root->right == NULL) {
free(root);
return NULL;
}
// 3-2. 삭제할 노드의 자식이 1개면?? 대체
else if (root->left == NULL) {
BSTNode* tmp = root->right;
free(root);
return tmp;
}
else if (root->right == NULL) {
BSTNode* tmp = root->left;
free(root);
return tmp;
}
// 3-3. 삭제할 노드의 자식이 2개면,
else {
// 오른쪽 최솟값 올리고
BSTNode* tmp = findMinValue(root->right);
root->item = tmp->item; // 값 갱신
root->right = removeNodeFromTree(root->right, tmp->item); // 오른쪽에서 재귀적으로 삭제 작업
}
}
return root;
}
- 트리가 비어있다면
NULL
반환 - 삭제할 노드를 재귀로 탐색
- 삭제할 노드를 찾았다면, (3가지 경우를 따져줘야 함)
- 삭제할 노드의 자식이 없는 경우
- 삭제할 노드의 자식이 1개인 경우
- 삭제할 노드의 자식이 2개인 경우
B-Tree 삽입과 삭제
영상 참고: Click!!
B-Tree 삽입
삽입 과정
- 트리가 비어있다면, 루트 노드를 할당하고
K
삽입- 트리가 비어있지 않다면, 데이터를 넣을 적절한 리프 노드 탐색
- 리프 노드에 데이터를 넣고 리프 노드가 적절한 상태에 있다면 종료
- 리프 노드가 부적절한 상태에 있다면 분리
- 분할이 일어나지 않는 경우
- 리프 노드가 넘치지 않았다면, 오름차순으로 K 삽입
- 분할이 일어나는 경우
- 리프 노드에 key 노드가 가득 찬 경우, 노드를 분할
B-Tree 삭제
재조정 과정
key
수가 여유있는 형제의 지원을 받는다.- 1번이 불가능하면 부모의 지원을 받고 형제와 합친다.
- 2번 후 부모에 문제가 있다면 거기서 다시 재조정한다.
- 리프 노드에서 삭제하고 재조정 할 필요 없는 경우
- 리프 노드에서 삭제하고 재조정 해야하는 경우
- key 수가 여유있는 형제의 지원을 받을 수 있는 경우
- key 수가 여유있는 형제의 지원을 받을 수 없는 경우에는 부모의 지원을 받고 형제와 합친다.
- internal 노드에서 데이터를 삭제하는 경우
- 삭제할 데이터의 선임자나 후임자와 위치를 바꿔준다.
2. C Pointer Quiz
Q24.
#include <stdio.h>
int main()
{
int var; /*Suppose address of var is 2000 */
void *ptr = &var;
*ptr = 5;
printf("var=%d and *ptr=%d",var,*ptr);
return 0;
}
void
포인터를 역참조 하는 것은 허용되지 않음void
가 불완전한 데이터 유형이기 때문- 따라서 올바른 방법은
void
포인터를 형변환하고 그 다음에 사용하는 것- A.
*ptr
->(int *)ptr