본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 1991 트리순회

by 까망 하르방 2021. 12. 14.
반응형

Approach

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

Tree 구조를 구현해서 아래 순서를 구현하는 문제이다.

• 전위 순회: Root  Left → Right

• 중위 순회: Left  Root → Right

• 후위 순회: Left  Right → Root

 

입력 데이터가 부모 - 자식 관계에 맞춰서 주어지기 때문에

트리를 구성해서 재귀방식으로 구현하면 된다.


C++

#include <stdio.h>

int N;
char parent, left, right;

typedef enum
{
    PRE_ORDER,
    IN_ORDER,
    POST_ORDER,
} TREE_ORDER;


struct
{
    char left, right;
} tree[27];


void treeTraversal(char ch, TREE_ORDER order)
{
    if (ch == '.') return;

    switch (order)
    {
    case PRE_ORDER: // 전위
        printf("%c", ch);
        treeTraversal(tree[ch].left, order);
        treeTraversal(tree[ch].right, order);
        break;

    case IN_ORDER: // 중위
        treeTraversal(tree[ch].left, order);
        printf("%c", ch);
        treeTraversal(tree[ch].right, order);
        break;

    case POST_ORDER: // 후위
        treeTraversal(tree[ch].left, order);
        treeTraversal(tree[ch].right, order);
        printf("%c", ch);
        break;
    default:
        break;
    }
}

int main()
{
    // freopen("input.txt", "r", stdin);

    scanf("%d", &N);
    for (int i = 0; i < N; i++)
    {
        scanf(" %c %c %c", &parent, &left, &right);
        tree[parent].left = left;
        tree[parent].right = right;
    }

    // 전위
    treeTraversal('A', PRE_ORDER); puts("");

    // 중위
    treeTraversal('A', IN_ORDER); puts("");

    // 후위
    treeTraversal('A', POST_ORDER); puts("");
}

 

Java

import java.util.Scanner;

class Tree{
	String name;
	Tree left;
	Tree right;
	
	
	public void leftConnect(Tree target){
		this.left = target;
	}
	
	public void rightConnect(Tree target){
		this.right = target;
	}
	
	public void setName(String name){
		this.name = name;
	}
	
}

public class Main {
	public static void preOrder(Tree curTree) {
		if(curTree == null) {
			return;
		}
		System.out.print(curTree.name);
		preOrder(curTree.left);
		preOrder(curTree.right);
	}
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = Integer.parseInt(sc.nextLine());
		Tree[] tree = new Tree[n];
		for (int i = 0; i < tree.length; i++) {
			tree[i] = new Tree();
		}
		for (int i = 0; i < n; i++) {
			String str = sc.nextLine();
			String[] temp = str.split(" ");
			int idx = temp[0].charAt(0)-65;
			
			tree[idx].setName(temp[0]);
			if(temp[1].equals("."))
				tree[idx].leftConnect(null);
			else{
				tree[idx].leftConnect(tree[temp[1].charAt(0)-65]);
			}
			if(temp[2].equals("."))
				tree[idx].rightConnect(null);
			else{
				tree[idx].rightConnect(tree[temp[2].charAt(0)-65]);
			}
		}
		
		Tree root = tree[0]; // 루트 노드 설정
		
		preOrder(root);
		System.out.println();
		inOrder(root);
		System.out.println();
		postOrder(root);
	}
	private static void inOrder(Tree curTree) {
		if(curTree == null) {
			return;
		}
		inOrder(curTree.left);
		System.out.print(curTree.name);
		inOrder(curTree.right);
	}
	private static void postOrder(Tree curTree) {
		if(curTree == null) {
			return;
		}
		postOrder(curTree.left);
		postOrder(curTree.right);
		System.out.print(curTree.name);
	}
}
반응형

'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글

[BOJ] 백준 2010 플러그  (0) 2021.12.23
[BOJ] 백준 15963 CASIO  (0) 2021.12.22
[BOJ] 백준 23291 어항 정리  (3) 2021.12.11
[BOJ] 백준 23289 온풍기 안녕!  (0) 2021.12.07
[BOJ] 백준 23290 마법사 상어와 복제  (1) 2021.11.27

댓글