Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 메모리 기법
- 은행 신용창조
- 금화본위제
- pow zkp 차이
- zkp
- cbdc 반대 청원
- 작업증명 뜻
- 지급 청산 결제 차이
- 지급 결제 차이
- 영지식증명 뜻
- 지급결제차이
- cbdc 프라이버시
- 비트코인 배경
- 스왑 영역 확인
- 인텔리제이 리네임
- 중앙은행 지급 결제
- CPU
- 한국은행 CBDC
- 최초적합
- cbdc 개인정보
- cbdc 도입 이유
- 금핵본위제
- 이진탐색트리 c
- 블록체인 배경
- 암호화폐 배경
- 화폐시스템의 변천
- 메모리 할당 방법
- 지급뜻
- cbdc 하는 이유
- 작업증명 영지식증명 차이
Archives
- Today
- Total
진강이의 성장일지
이진탐색트리 삽입(반복, 재귀) - C로 구현 본문
반복(Iterative search) 으로 구현
#include <stdio.h>
#include <stdlib.h>
// 트리 노드 정의
typedef struct treeNode {
int key;
struct treeNode* leftChild;
struct treeNode* rightChild;
} treeNode, * treePointer;
// modifiedSearch 함수 정의
treePointer modifiedSearch(treePointer root, int k) {
treePointer p = root;
treePointer lastExamined = NULL; // 마지막으로 탐색한 노드를 저장할 변수
while (p != NULL) {
lastExamined = p; // 현재 노드를 lastExamined에 저장
if (k < p->key) // k가 key보다 작으면
p = p->leftChild; // 왼쪽 서브트리로 이동
else if (k > p->key) // k가 key보다 크면
p = p->rightChild; // 오른쪽 서브트리로 이동
else // k가 key와 같으면
return NULL; // NULL 반환 (값이 이미 존재)
}
return lastExamined; // 마지막으로 탐색한 노드 반환
}
// insert 함수 정의
void insert(treePointer* node, int k) {
/* if k is in the tree pointed at by node do nothing;
otherwise add a new node with data = k */
treePointer ptr;
/* searches the binary search tree *node for the key k */
treePointer temp = modifiedSearch(*node, k);
if (temp || !(*node)) {
/* k is not in the tree */
ptr = (treePointer)malloc(sizeof(treeNode));
if (ptr == NULL) {
fprintf(stderr, "메모리 할당 실패\n");
exit(1);
}
ptr->key = k;
ptr->leftChild = ptr->rightChild = NULL;
if (*node) { /* insert as child of temp */
if (k < temp->key)
temp->leftChild = ptr;
else
temp->rightChild = ptr;
}
else
*node = ptr;
}
else {
printf("같은 값 존재\n");
}
}
// 이진 탐색 트리의 중위 순회(inorder traversal) 함수
void inorderTraversal(treePointer root) {
if (root != NULL) {
inorderTraversal(root->leftChild);
printf("%d ", root->key);
inorderTraversal(root->rightChild);
}
}
int main() {
treePointer root = NULL;
// 7, 3, 8, 1, 5의 값을 갖는 이진 탐색 트리 생성
insert(&root, 7);
insert(&root, 3);
insert(&root, 8);
insert(&root, 1);
insert(&root, 5);
printf("이진 탐색 트리 중위 순회 결과: ");
inorderTraversal(root);
printf("\n");
// 값 6을 이진 탐색 트리에 삽입
insert(&root, 6);
printf("6을 삽입한 후 이진 탐색 트리 중위 순회 결과: ");
inorderTraversal(root);
printf("\n");
return 0;
}
재귀로 구현
#include <stdio.h>
#include <stdlib.h>
// 트리 노드 정의
typedef struct treeNode {
int key;
struct treeNode* leftChild;
struct treeNode* rightChild;
} treeNode, *treePointer;
// 재귀적으로 노드를 삽입하는 함수
treePointer insertNode(treePointer root, int key) {
// 기저 조건: 트리가 비어 있으면 새 노드를 반환
if (root == NULL) {
treePointer newNode = (treePointer)malloc(sizeof(treeNode));
if (newNode == NULL) {
fprintf(stderr, "메모리 할당 실패\n");
exit(1);
}
newNode->key = key;
newNode->leftChild = newNode->rightChild = NULL;
return newNode;
}
// 재귀적으로 왼쪽 또는 오른쪽 서브트리에 삽입
if (key < root->key)
root->leftChild = insertNode(root->leftChild, key);
else if (key > root->key)
root->rightChild = insertNode(root->rightChild, key);
else
printf("같은 값 존재\n");
return root;
}
// 이진 탐색 트리의 중위 순회(inorder traversal) 함수
void inorderTraversal(treePointer root) {
if (root != NULL) {
inorderTraversal(root->leftChild);
printf("%d ", root->key);
inorderTraversal(root->rightChild);
}
}
int main() {
treePointer root = NULL;
// 7, 3, 8, 1, 5의 값을 갖는 이진 탐색 트리 생성
root = insertNode(root, 7);
root = insertNode(root, 3);
root = insertNode(root, 8);
root = insertNode(root, 1);
root = insertNode(root, 5);
printf("이진 탐색 트리 중위 순회 결과: ");
inorderTraversal(root);
printf("\n");
// 값 6을 이진 탐색 트리에 삽입
root = insertNode(root, 6);
printf("6을 삽입한 후 이진 탐색 트리 중위 순회 결과: ");
inorderTraversal(root);
printf("\n");
return 0;
}