티스토리 뷰

import java.io.*;
import java.util.*;

class Main {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int count = Integer.parseInt(in.readLine());
int[][] array = new int[count][2];
for(int i=0; i<count; ++i) {
String input = in.readLine();
int x = input.charAt(0) - 'A';
char y = input.charAt(2);
char z = input.charAt(4);
if(y == '.') {
array[x][0] = -1;
} else {
array[x][0] = y - 'A';
}
if(z == '.') {
array[x][1] = -1;
} else {
array[x][1] = z - 'A';
}
}
preorder(array, 0);
System.out.println();
inorder(array, 0);
System.out.println();
postorder(array, 0);
}
static void preorder(int[][] array, int start) {
if(start == -1) {
return;
}
System.out.print((char)(start + 'A'));
preorder(array, array[start][0]);
preorder(array, array[start][1]);
}
static void inorder(int[][] array, int start) {
if(start == -1) {
return;
}
inorder(array, array[start][0]);
System.out.print((char)(start + 'A'));
inorder(array, array[start][1]);
}
static void postorder(int[][] array, int start) {
if(start == -1) {
return;
}
postorder(array, array[start][0]);
postorder(array, array[start][1]);
System.out.print((char)(start + 'A'));
}
}


배열에 트리를 저장하여 전위순회 / 중위순회 / 후위순회를 행한다.

입력으로 문자가 들어오는데 배열의 인덱스로 요소에 접근하려면 0이 아닌 정수 형태로 바꿔주는게 좋겠다.

저장은 정수로 하고 출력할 때 다시 처리해주는 게 좋다.


모든 순회의 경우 재귀호출로 구현할 수 있는데, 루트 노드를 출력하는 줄만 다르게 작성해주고 자식 노드를 순회하는 코드를 작성해주면 된다.


Swift는 문자를 정수로 바꾸고 정수를 문자로 바꾸는 작업이 쉽지 않다...




let A = Int(("A".unicodeScalars.first?.value)!)


func preorder(array: [[Int]], start: Int) {

    if start == -1 {

        return

    }

    print(UnicodeScalar(start + A)!, terminator: "")

    preorder(array: array, start: array[start][0])

    preorder(array: array, start: array[start][1])

}

func inorder(array: [[Int]], start: Int) {

    if start == -1 {

        return

    }

    inorder(array: array, start: array[start][0])

    print(UnicodeScalar(start + A)!, terminator: "")

    inorder(array: array, start: array[start][1])

}

func postorder(array: [[Int]], start: Int) {

    if start == -1 {

        return

    }

    postorder(array: array, start: array[start][0])

    postorder(array: array, start: array[start][1])

    print(UnicodeScalar(start + A)!, terminator: "")

}


let count = Int(readLine()!)!

var array = [[Int]].init(repeating: [0, 0], count: count)

for _ in 0..<count {

    let input = readLine()!.split(separator: " ")

    let x = Int((input[0].unicodeScalars.first?.value)!) - A

    let y = input[1].description

    let z = input[2].description

    if y == "." {

        array[x][0] = -1

    } else {

        array[x][0] = Int((y.unicodeScalars.first?.value)!) - A

    }

    if z == "." {

        array[x][1] = -1

    } else {

        array[x][1] = Int((z.unicodeScalars.first?.value)!) - A

    }

}

preorder(array: array, start: 0)

print()

inorder(array: array, start: 0)

print()

postorder(array: array, start: 0)

print()



'Algorithm > Baekjoon Online Judge' 카테고리의 다른 글

4948번 '베르트랑 공준'  (0) 2018.08.13
11725번 '트리의 부모 찾기'  (0) 2018.08.11
2902번 'KMP는 왜 KMP일까?'  (0) 2018.08.10
10451번 '순열 사이클'  (0) 2018.08.10
3036번 '링'  (0) 2018.08.10
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함