개발자의 공부/자료구조&알고리즘

[알고리즘]너비 우선 탐색(BFS, Breadth-First Search)

2023. 3. 12. 12:55
목차
  1. ✅ 트리 순회(Tree Trabersal)란?
  2. 🤔 너비 우선 탐색(BFS, Breadth-first Search)
  3. 구현

✅ 트리 순회(Tree Trabersal)란?

트리 순회는

트리 구조에서 각각의 노드를 정확히 한 번만, 체계적인 방법으로 방문하는 과정을 말한다. 이진트리뿐만 아니라 모든 트리에서도 일반화될 수 있다. 트리를 순회하는 데는 두 가지 전략이 존재한다. 

  • 너비 우선 탐색(BFS, Breadth-first Search)
  • 깊이 우선 탐색(DFS, Depth-first Search)

🤔 너비 우선 탐색(BFS, Breadth-first Search)

루트 노드에서 시작해서 인접한 노드를 먼저 탐색하는 방법이다. 

👍 BFS 특징

  • 두 노드 사이의 최단 경로를 탐색할 때 활용하기 좋은 방식. 멀리 떨어진 노드는 나중에 탐색하기 때문이다.
  • 큐를 활용해서 탐색할 노드의 순서를 저장하고 큐에 저장된 순서대로 탐색한다. 

🔥 의사코드

  • 큐를 만들고 방문한 노드의 값을 저장할 변수를 만든다.
  • root를 가지고 큐에 넣은 다음, 큐에 무언가가 있다면 계속 루프를 돌린다. 
    • 큐에서 노드를 dequeue를 하고, 노드를 저장하는 변수에 값을 푸시한다. 
    • 제거된 노드에 left 속성이 있는 경우 큐에 추가한다.
    • 제거된 노드에 right 속성이 있는 경우 큐에 추가한다.
  • 모든 값을 저장한 변수를 반환한다.

원리를 간단하게 그림으로 살펴보자. 아래와 같은 트리가 있다.

추적하고 있는 큐와 visited라는 것이 있는데 가장 마지막에 데이터의 목록, 즉 배열을 출력하게 된다. 

10을 큐에 추가하고, 루프를 돈다. 큐에 무언가가 들어있나 확인을 하고, 무언가가 있으니 꺼내서 visited 목록에 넣어준 다음. 왼쪽 값이 있나 확인한다. 있으니 그 값을 큐에 넣어주고 오른쪽을 확인한다. 

큐에서 가장 먼저 온 값(6)을 제거하고, 왼쪽과 오른쪽을 확인하고 있다면, 큐에 넣어준다. 6에서 할 작업은 끝났고

15를 큐에서 제거하고 왼쪽과 오른쪽을 살핀다. 

위와 같은 작업을 반복한다.

큐가 비었으니 작업이 종료되었다는 것을 알 수 있다. 이것이 너비 우선 탐색이다.

구현

BFS() {
    let data = [];
    let queue = [];
    let node = this.root;
    queue.push(node);
        
    while (queue.length) {
        node = queue.shift();
        data.push(node.value);
        if(node.left) queue.push(node.left);
        if(node.right) queue.push(node.right);
    }
    return data;
}

 

저작자표시 비영리 동일조건 (새창열림)

'개발자의 공부 > 자료구조&알고리즘' 카테고리의 다른 글

[자료구조] 힙(Heap)  (0) 2023.04.28
[알고리즘]깊이 우선 탐색(DFS, Depth-First Search)  (0) 2023.03.16
[자료구조]이진 검색 트리(Binary Search Tree)  (0) 2023.03.11
[자료구조]스택(Stack)과 큐(Queue)  (0) 2023.03.05
최대공약수, 최대공배수 구하기  (0) 2023.02.02
  1. ✅ 트리 순회(Tree Trabersal)란?
  2. 🤔 너비 우선 탐색(BFS, Breadth-first Search)
  3. 구현
'개발자의 공부/자료구조&알고리즘' 카테고리의 다른 글
  • [자료구조] 힙(Heap)
  • [알고리즘]깊이 우선 탐색(DFS, Depth-First Search)
  • [자료구조]이진 검색 트리(Binary Search Tree)
  • [자료구조]스택(Stack)과 큐(Queue)
JMins
JMins
안녕하세요. 프론트엔드 개발자 김정민입니다. 개발 지식을 공유하고 기록하는 공간입니다.
JMins
개발자 노트
JMins
전체
오늘
어제
  • 분류 전체보기 (85)
    • 개발자의 공부 (73)
      • React (17)
      • 자료구조&알고리즘 (28)
      • JS (17)
      • TS (8)
      • Nodejs (0)
      • Nextjs (1)
      • 기타 (1)
      • Design Pattenrs (0)
      • 테스트 및 최적화 (1)
    • 문제 및 해결 (9)
    • 기본 지식 (3)
    • 챌린지 (0)

블로그 메뉴

  • 홈

공지사항

  • #블로그 스킨 변경
  • 개인적으로 공부를 기록하기 위해 적고 있습니다.

인기 글

최근 댓글

최근 글

hELLO · Designed By 정상우.
JMins
[알고리즘]너비 우선 탐색(BFS, Breadth-First Search)
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.