일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- TypeORM
- nestjs auth
- 구조체배열
- Spring
- 프로그래머스
- OpenCV
- Nodejs
- 시스템호출
- git
- AWS
- thymeleaf
- 카카오 알고리즘
- nestJS
- @Autowired
- @Component
- python
- 카카오
- 코딩테스트
- 해시
- 코테
- spring boot
- 컴포넌트스캔
- C언어
- nestjs typeorm
- 스프링
- 가상면접사례로배우는대규모시스템설계기초
- 파이썬
- 카카오 코테
- C++
- 알고리즘
Archives
- Today
- Total
공부 기록장 💻
[자료구조] 이진 트리의 레벨 순회(level_order) 본문
레벨 순회(level_order)는 각 노드를 레벨 순으로 검사하는 순회 방법이다.
레벨 1인 루트 노드부터 시작하여, 아래로 내려갈 수록 증가되는 각 레벨을
좌에서 우로 방문한다.
레벨 순회는 큐 구조를 사용하여 구현한다.
레벨 순회는 큐에 하나란도 노드가 있으면, 계속 반복하는 코드로 이루어져 있다.
먼저 큐에 있는 노드를 꺼내어 방문한 다음, 그 노드의 자식 노드를 큐에 삽입하는 것으로 한번의 반복을 끝낸다.
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
int data;
struct TreeNode* left, * right;
}TreeNode;
#define MAX_QUEUE_SIZE 100
typedef TreeNode* element;
typedef struct {
element data[MAX_QUEUE_SIZE];
int front, rear;
}QueueType;
void error(char* message) {
fprintf(stderr, "%s\n", message);
exit(1);
}
void init_queue(QueueType* q) {
q->front = q->rear = 0;
}
int is_empty(QueueType* q) {
return (q->front == q->rear);
}
int is_full(QueueType* q) {
return((q->rear + 1) % MAX_QUEUE_SIZE == q->front);
}
void enqueue(QueueType* q, element item) {
if (is_full(q))
error("큐가 포화상태입니다.");
q->rear = (q->rear + 1) % MAX_QUEUE_SIZE;
q->data[q->rear] = item;
}
element dequeue(QueueType* q) {
if (is_empty(q))
error("큐가 공백상태입니다.");
q->front = (q->front + 1) % MAX_QUEUE_SIZE;
return q->data[q->front];
}
void level_order(TreeNode* ptr) {
QueueType q;
init_queue(&q);
if (ptr == NULL) return;
enqueue(&q, ptr);
while (!is_empty(&q)) {
ptr = dequeue(&q);
printf(" [%d] ", ptr->data);
if (ptr->left)
enqueue(&q, ptr->left);
if (ptr->right)
enqueue(&q, ptr->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("레벨 순회= ");
level_order(root);
printf("\n");
}
728x90
반응형
'# CS Study > DS Algorithm' 카테고리의 다른 글
[자료구조] 이진 트리의 노드, 단말 노드 개수, 높이 구하기 연산 (0) | 2021.09.26 |
---|---|
[자료구조] 수식 트리 계산 프로그램 (0) | 2021.09.23 |
[자료구조] 이진 트리(Binary Tree)의 구조와 전위, 중위, 후위 순환/반복 순회 (0) | 2021.09.23 |
[자료구조] 스택 / 큐 / 연결리스트 정리 (0) | 2021.06.07 |
[자료구조] 이중 연결 리스트 (Doubly Linked List) 를 이용한 mp3 음악 재생 프로그램 - 양방향 순회(검색, 추가, 삭제, (0) | 2021.06.07 |
Comments