일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- @Autowired
- @Component
- python
- git
- OpenCV
- Nodejs
- nestjs typeorm
- C언어
- 해시
- 코테
- 컴포넌트스캔
- thymeleaf
- AWS
- 프로그래머스
- 카카오 코테
- nestJS
- 카카오 알고리즘
- spring boot
- 시스템호출
- TypeORM
- nestjs auth
- 스프링
- 코딩테스트
- Spring
- C++
- 가상면접사례로배우는대규모시스템설계기초
- 파이썬
- 카카오
- 구조체배열
- 알고리즘
Archives
- Today
- Total
공부 기록장 💻
[자료구조] 이진 트리(Binary Tree)의 구조와 전위, 중위, 후위 순환/반복 순회 본문
# CS Study/DS Algorithm
[자료구조] 이진 트리(Binary Tree)의 구조와 전위, 중위, 후위 순환/반복 순회
dream_for 2021. 9. 23. 14:51순환을 이용한 이진 트리 중위, 전위, 후위 순회
#include <stdio.h>
#include <stdlib.h>
// 이진 트리 노드 구조체
typedef struct TreeNode {
int data;
struct TreeNode* left, * right;
}TreeNode;
// 15
// 4 20
// 1 16 25
TreeNode n1 = { 1, NULL, NULL };
TreeNode n2 = { 4, &n1, NULL };
TreeNode n3 = { 16, NULL, NULL };
TreeNode n4 = { 25, NULL, NULL };
TreeNode n5 = { 20, &n3, &n4 };
TreeNode n6 = { 15, &n2, &n5 };
TreeNode* root = &n6;
// 중위 순회
void inorder(TreeNode* root) {
if (root != NULL) {
inorder(root->left);
printf("[ %2d ] ", root->data);
inorder(root->right);
}
}
// 전위 순회
void preorder(TreeNode* root) {
if (root != NULL) {
printf("[ %2d ] ", root->data);
preorder(root->left);
preorder(root->right);
}
}
// 후위 순회
void postorder(TreeNode* root) {
if (root != NULL) {
postorder(root->left);
postorder(root->right);
printf("[ %2d ] ", root->data);
}
}
int main() {
printf("전위 순회= ");
preorder(root);
printf("\n");
printf("중위 순회= ");
inorder(root);
printf("\n");
printf("후위 순회= ");
postorder(root);
printf("\n");
}
스택, 반복 구조를 이용한 이진 트리 중위 순회
#include <stdio.h>
#include <stdlib.h>
// 이진 트리 노드 구조체
typedef struct TreeNode {
int data;
struct TreeNode* left, * right;
}TreeNode;
#define SIZE 100
int top = -1;
TreeNode* stack[SIZE];
void push(TreeNode* p) {
if (top < SIZE - 1)
stack[++top] = p;
}
TreeNode* pop() {
TreeNode* p = NULL;
if (top >= 0)
p = stack[top--];
return p;
}
// 스택 구조를 사용한 반복적 순회(중위)
void inorder_iter(TreeNode* root) {
while (1) {
for (;root;root = root->left) // 한 루트에 대한 왼쪽 서브 노드들을 모두 스택에 삽입
push(root);
// 왼쪽 서브 노드들을 하나씩 pop하여 출력
root = pop();
if (!root) break;
printf("[ %2d ] ", root->data);
// 각 왼쪽 서브노드의 오른쪽 서브 노드로 이동
root = root->right;
}
}
// 15
// 4 20
// 1 16 25
TreeNode n1 = { 1, NULL, NULL };
TreeNode n2 = { 4, &n1, NULL };
TreeNode n3 = { 16, NULL, NULL };
TreeNode n4 = { 25, NULL, NULL };
TreeNode n5 = { 20, &n3, &n4 };
TreeNode n6 = { 15, &n2, &n5 };
TreeNode* root = &n6;
int main() {
printf("스택과 반복을 이용한 중위 순회= ");
inorder_iter(root);
printf("\n\n");
}
728x90
반응형
'# CS Study > DS Algorithm' 카테고리의 다른 글
[자료구조] 수식 트리 계산 프로그램 (0) | 2021.09.23 |
---|---|
[자료구조] 이진 트리의 레벨 순회(level_order) (0) | 2021.09.23 |
[자료구조] 스택 / 큐 / 연결리스트 정리 (0) | 2021.06.07 |
[자료구조] 이중 연결 리스트 (Doubly Linked List) 를 이용한 mp3 음악 재생 프로그램 - 양방향 순회(검색, 추가, 삭제, (0) | 2021.06.07 |
[자료구조] 연결 리스트 (Linked List) 응용 - 특정 위치에 데이터 삽입과 삭제, 선행 노드의 포인터 이용 (0) | 2021.06.07 |
Comments