5639번

2023. 2. 14. 09:07·CS 이론/알고리즘
728x90

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

 

5639번: 이진 검색 트리

트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다

www.acmicpc.net

오늘 풀은 문제는 이진 트리 검색이다.

저번에 풀은 트리 순회 문제와 순회 방식은 같지만 입력 받는 값들이 전위 순회로 출련된 값들이 주어진다.

그래서 트리를 클래스형으로 구성할 때 조건문을 신경써야 한다.

또한 이 문제는 입력받는 노드의 수가 정해져있지 않아서

입력값이 null인지를 확인하여 반복을 멈추어야한다.

그래서 이 문제는 입력에 주의하여 이진 트리를 생성하는 것이 관건이다.

 

이진트리는 왼쪽 자식에는 부모보다 작은 값, 오른쪽 쪽 자식에는 부모보다 큰 값을 저장하는 트리이기 때문에 이 조건을 이용하여 조건문을 작성해 주었다.

추가로 재귀를 사용하면 가능하다.

 

동작 방식은

1. 부모 노드보다 작은 값인가 확인한다.

2. 작다면 왼쪽 자식이 비어있는지 확인한다.

3. 비어있으면 넣고, 비어있지 않으면 왼쪽 자식을 탐색한다.

1. 부모 노드보다 큰 값인가 확인한다.

2. 크다면 오른쪽 자식이 비어있는지 확인한다.

3. 비어있으면 넣고, 비어있지 않으면 오른쪽 자식을 탐색한다.

 

후위 순회는 알고있을 거라 생각하여 설명은 생략한다.

(왼쪽 자식 노드, 오른쪽 자식 노드, 부모 노드 순)

 

정답코드는 아래와 같다.

package backjoon.b5639;

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

public class b5639 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        Node root = new Node(Integer.parseInt(br.readLine()));
        Graph g = new Graph(root);

        while (true){
            String sData = br.readLine();

            if(sData==null) {
                break;
            }
            if(sData.length()==0){
                break;
            }
            g.create(Integer.parseInt(sData));
        }
        g.postOrder(root);
        System.out.println(g.sb);
    }
}
class Graph{
    Node root;
    StringBuilder sb;

    public Graph(Node root) {
        this.root = root;
        sb = new StringBuilder();
    }
    public void create(int data){
        search(root,data);
    }
    public void search(Node node, int data){
        if(node==null){
            return;
        }
        if(node.data>data){
            if(node.left==null){
                node.left = new Node(data);
            }
            else{
                search(node.left,data);
            }
        }
        else if(node.data<data){
            if(node.right==null){
                node.right = new Node(data);
            }
            else {
                search(node.right,data);
            }
        }
    }
    public void postOrder(Node node){
        if(node!=null){
            if(node.left!=null)postOrder(node.left);
            if(node.right!=null)postOrder(node.right);
            sb.append(node.data).append("\n");
        }
    }
}
class Node{
    Node right;
    Node left;
    int data;

    public Node(int data) {
        this.data = data;
    }
}
728x90

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

10816번  (0) 2023.02.16
1021번  (1) 2023.02.15
1991번  (0) 2023.02.13
11725번  (1) 2023.02.12
1806번  (0) 2023.02.11
'CS 이론/알고리즘' 카테고리의 다른 글
  • 10816번
  • 1021번
  • 1991번
  • 11725번
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) N
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

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

티스토리툴바