1991번

2023. 2. 13. 10:53·CS 이론/알고리즘
728x90

https://www.acmicpc.net/problem/1991

 

1991번: 트리 순회

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

www.acmicpc.net

오늘은 트리의 기초인 트리순회 3가지에 대해 공부해보고 문제를 풀었다.

처음에는 1차원 배열로 시도하려고 했지만 어떤식으로 배열을 처리해야할지 감이 잡히지 않아서 클래스를 이용한 순회로 변경하였다..

이 문제를 풀기위해 알아야 할 것은 전위순회, 중위순회, 후위순회인데 전,중,후를 나누는 기준은 부모노드를 어디에 두느냐이다.

말 그대로 순회를 할때 부모노드를 제일먼저 탐색하고 왼쪽자식, 오른쪽 자식 순으로 가면 전위순회, 왼쪽 자식, 부모 노드, 오른쪽 자식 순으로 순회하면 중위순회, 왼쪽, 오른쪽 자식, 부모 노드 순으로 순회하면 후위 순회이다.

정리하면,

부모, 왼쪽, 오른쪽 - 전위 순회

왼쪽, 부모, 오른쪽 - 중위 순회

왼쪽, 오른쪽, 부모 - 후위 순회

 

따라서 재귀를 사용하여 탐색하면 된다.

중위 순회는 백트래킹을 생각해보면 이해가 쉬울 것이다.

 

그래서 메서드는 2가지로 나누었다.

root노드를 기반으로 트리를 만들기 위한 createTree와 노드의 위치를 찾기위한 search로 만들었고,

그 다음 3가지 전위, 중위, 후위 메서드를 구현했다.

 

트리 생성과 순회 과정에서 모두 재귀를 사용하였다.

생성과정에서는 입력받은 값들 중 부모 노드와 일치하는 값을 찾아서 왼쪽, 오른쪽이 비어있으면 채우고, 찾지 못하면 남은 노드들을 계속 확인하는 방식으로 했다.

순회는 위에서 설명한 순서대로 탐색하도록 했다.

 

package backjoon.b1991;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class b1991 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        Node root = new Node("A");
        Tree g = new Tree(root);

        for(int i=0; i<N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            String data = st.nextToken();
            String leftData = st.nextToken();
            String rightData = st.nextToken();
            g.creatTree(data,leftData,rightData);
        }
        g.preOrder(root);
        g.sb.append("\n");
        g.inOrder(root);
        g.sb.append("\n");
        g.postOrder(root);
        System.out.println(g.sb);
    }
}
class Tree{
    Node root;

    StringBuilder sb = new StringBuilder();
    public Tree(Node root) {
        this.root = root;
    }

    public void creatTree(String data, String leftData, String rightData){
        search(root,data,leftData,rightData);
    }
    public void search(Node node, String data, String leftData, String rightData){
        if(node==null){
            return;
        }
        else if (node.data.equals(data)) {
            if (node.left==null){
                node.left = new Node(leftData);//왼쪽 자식 없으면 채우기
            }
            if(node.right==null){
                node.right = new Node(rightData);//오른쪽 자식 없으면 채우기
            }
        }
        else {
            search(node.left,data,leftData,rightData);//노드의 왼쪽 자식 탐색
            search(node.right,data,leftData,rightData);//노드의 오른쪽 자식 탐색
        }
    }
    public void preOrder(Node node){
        if(node!=null){
            if(!node.data.equals("."))sb.append(node.data);
            if(node.left!=null)preOrder(node.left);
            if(node.right!=null)preOrder(node.right);
        }
    }//전위 순회
    public void inOrder(Node node){
        if(node!=null){
            if(node.left!=null)inOrder(node.left);
            if(!node.data.equals("."))sb.append(node.data);
            if(node.right!=null)inOrder(node.right);
        }
    }//중위 순회
    public void postOrder(Node node){
        if(node!=null){
            if(node.left!=null)postOrder(node.left);
            if(node.right!=null)postOrder(node.right);
            if(!node.data.equals("."))sb.append(node.data);
        }
    }//후위 순회
}
class Node{
    Node left;

    Node right;
    
    String data;

    public Node(String data) {
        this.data = data;
    }
}

 

728x90

'CS 이론 > 알고리즘' 카테고리의 다른 글

1021번  (1) 2023.02.15
5639번  (0) 2023.02.14
11725번  (1) 2023.02.12
1806번  (0) 2023.02.11
2470번  (0) 2023.02.10
'CS 이론/알고리즘' 카테고리의 다른 글
  • 1021번
  • 5639번
  • 11725번
  • 1806번
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199) N
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1) N
        • 프리코스 회고록 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DFS
    8기
    뛰슈
    그래프 순회
    자바
    절개와지조
    나는 감자
    감자
    백준
    회고록
    프리코스
    모각코
    BFS
    오블완
    타임리프
    어렵다
    JPA
    누적합
    티스토리챌린지
    Spring
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
1991번
상단으로

티스토리툴바