jiho_bae
Go devlog
jiho_bae
전체 방문자
오늘
어제
  • 분류 전체보기 (158)
    • JavaScript (38)
      • theory (34)
      • vanilla (4)
    • HTML & CSS (2)
    • Browser (3)
    • CS (6)
      • linux (1)
      • shell (2)
      • compiler (2)
    • DS & Algorithm (87)
      • theory (5)
      • basic (7)
      • programmers (30)
      • baekjoon (45)
    • Design Pattern (2)
    • Error (4)
    • Git & Github (4)
    • Tools (1)
    • 부트캠프 (4)
    • Small Tips (2)
    • Java (3)
    • test (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 퀵정렬 자바스크립트
  • 덧칠하기 javascript
  • 대충만든자판 javascript
  • 자바스크립트 비동기 마이크로 태스크 큐와 렌더링 과정
  • 리코쳇 로봇 javascript
  • 13460 javascript nodejs
  • safari invalid date error
  • 25632 소수 부르기 게임
  • 백준 17406 nodeJS
  • 자바스크립트 커링
  • 프로그래머스 숫자카드나누기 javascript
  • 병합정렬 자바스크립트
  • 가사 검색 자바스크립트
  • 계수정렬 자바스크립트
  • 1753 최단경로 javascript
  • 자바스크립트 모듈 시스템
  • 리액트 프로젝트 디버깅하기
  • 자바스크립트 sort는 왜 그모양일까
  • 외벽 점검 javascript
  • safari Date format NaN
  • 억억단을 외우자 javascript
  • 백준 자바스크립트 입력 템플릿
  • 자바스크립트 채팅방 스크롤
  • 자바스크립트 배열의 특수함
  • fetch 취소하기
  • 카카오 코딩테스트 양궁대회 nodeJS
  • 자바스크립트 이벤트 위임
  • JavaScript
  • 깃 이전 커밋에서 새 브랜치 만들기
  • javascript use strict

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
jiho_bae
DS & Algorithm/baekjoon

[백준] 1991 트리 순회 - JavaScript(NodeJS)

[백준] 1991 트리 순회 - JavaScript(NodeJS)
DS & Algorithm/baekjoon

[백준] 1991 트리 순회 - JavaScript(NodeJS)

2021. 6. 3. 11:37

문제

 

1991번: 트리 순회

첫째 줄에는 이진 트리의 노드의 개수 N(1≤N≤26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 영문자

www.acmicpc.net

 

풀이

전위 순회, 중위 순회, 후위 순회를 순차적으로 실행하고 결과를 출력한다.

 

문제의 중요한 조건은 항상 A가 루트 노드이며 자식 노드가 없다면 .으로 표현된다.

 

입력에서 루트가 번호가 아닌 알파벳이 주어지므로, 객체를 이용하자.

 

node의 left, right 순으로 순회하도록 함수를 작성할 것이므로
어느 시점에서 노드를 출력하는가에 따라 전위, 중위, 후위 순회인지가 결정될 것이다.

 

 

코드로 바로 구현해본다.

코드

const sol = (input) => {
  const N = +input[0];
  input = input.slice(1);
  const tree = {};
  for (let i = 0; i < N; i++) {
    const [node, left, right] = input[i].split(" ");
    tree[node] = [left, right];  // tree의 키 값으로 노드를 저장하고, 값으로는 left, right가 담긴 배열을 저장한다.
  }

  let result = "";
  
  function preorder(node) {
    if (node === ".") return;
    const [lt, rt] = tree[node];
    result += node;
    preorder(lt);
    preorder(rt);
  }
  // 전위순회는 루트부터 기록을 시작하므로, 재귀의 맨 앞에서 우선 기록한다.

  function inorder(node) {
    if (node === ".") return;
    const [lt, rt] = tree[node];
    inorder(lt);
    result += node;
    inorder(rt);
  }
  // 중위순회는 왼쪽-루트-오른쪽 순이므로, 왼쪽의 재귀가 끝난 시점에서 기록한다.

  function postorder(node) {
    if (node === ".") return;
    const [lt, rt] = tree[node];
    postorder(lt);
    postorder(rt);
    result += node;
  }
  // 후위순회는 왼쪽-오른쪽-루트 순이므로, 왼쪽과 오른쪽 재귀가 끝난 시점에서 기록한다.

  preorder("A");
  result += "\n";
  inorder("A");
  result += "\n";
  postorder("A");

  return result;
};

// 백준에서 입력을 받는 코드
const input = [];
require("readline")
  .createInterface(process.stdin, process.stdout)
  .on("line", (line) => {
    input.push(line);
  })
  .on("close", () => {
    console.log(sol(input));
    process.exit();
  });

 

다음과 같이 출력하는 시점에 따라 순회가 달라진다.

 

바로 이해가 가지 않는다면, 트리를 직접 만들어서 손으로 그려보면서 하나씩 추적해보면 더 이해가 쉽다.

 

 

저작자표시

'DS & Algorithm > baekjoon' 카테고리의 다른 글

[백준] 11725번 트리의 부모 찾기 - JavaScript(NodeJS)  (0) 2021.06.03
[백준] 2250 트리의 높이와 너비 - JavaScript(NodeJS)  (0) 2021.06.03
[백준] 1261번 알고스팟 - JavaScript(NodeJS)  (0) 2021.06.01
[백준] 14226 이모티콘 - JavaScript(NodeJS)  (0) 2021.06.01
[백준] 13549 숨바꼭질3 - JavaScript(NodeJS)  (0) 2021.06.01
  • 문제
  •  
  • 풀이
  • 코드
'DS & Algorithm/baekjoon' 카테고리의 다른 글
  • [백준] 11725번 트리의 부모 찾기 - JavaScript(NodeJS)
  • [백준] 2250 트리의 높이와 너비 - JavaScript(NodeJS)
  • [백준] 1261번 알고스팟 - JavaScript(NodeJS)
  • [백준] 14226 이모티콘 - JavaScript(NodeJS)
jiho_bae
jiho_bae
하루에 한 걸음씩

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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