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 |
Tags
- wan 뜻
- lan 뜻
- 컴퓨터 네트워킹: 하향식 접근(8판)
- 혼자 공부하는 네트워크
- 컴퓨터 네트워크 요약
- computer networking a top-down approach 요약정리
- tracert #네트워크경로추적
- 컴퓨터 네트워킹 하향식 접근 8판
- tcp/ip 4계층 단위
- 이진탐색트리 c
- 소켓구별
- 패킷교환방식
- 헤더 트레일러
- 메시지교환방식
- 캡슐화역캡슐화
- 프로토콜 예시
- tcp/cp 4계층
- computer networking a top-down approach
- tcp/ip 4계층 구조
- 컴퓨터 네트워크 정리
- CPU
- dns 뜻
- 네트워크 애플리케이션 정리
- osi7계층 단위
- computer networking a top-down approach 8판
- 계층별 프로토콜
- 프로토콜 개념
- 라우터 뜻
- 컴퓨터 네트워킹 하향식 접근 요약 8판 요약
- 네트워크 pdf
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;
}