[java]트리 순회 - 백준1991

문제



풀이

문제 해석을 하자면,

  • 전위, 중위, 후위순회를 구하는 문제이며 트리 순회의 기본이 되는 개념이므로 모른다면 구글링을 해서 익혀두자.


풀이

  • 문자보단 숫자가 좋아서, 숫자로 바꿔서 노드를 입력받았다.
    • 이때, 숫자로 바꿔서 노드를 기록하다보니 “.” 은 -18로 기록됨을 기억해두자.
    • 또한, 루트 노드 무조건 A이고, 이진트리라서 간단히 2차원 배열로 입력받았다.



코드

/**
 * 전위, 중위, 후위순회
 * 숫자로 바꿔서 노드 기록하다보니 "." 은 -18로 기록
 * 참고 : 루트 노드 무조건 A, 이진트리라서 간단히 2차원 배열로 해결하였음
 */

static int[][] inArr = new int[30][2]; // left, right 기록 => 이진트리니까 그냥 배열로

static void preTravel(StringBuilder sb, int root) {
    if(root == -1 || root == -18) return;
    char temp = (char) (root+'A'-1);
    sb.append(temp); // root
    preTravel(sb, inArr[root][0]); // left
    preTravel(sb, inArr[root][1]); // right
}
static void inTravel(StringBuilder sb, int root) {
    if(root == -1 || root == -18) return;
    char temp = (char) (root+'A'-1);
    inTravel(sb, inArr[root][0]); // left
    sb.append(temp); // root
    inTravel(sb, inArr[root][1]); // right
}
static void postTravel(StringBuilder sb, int root) {
    if(root == -1 || root == -18) return;
    char temp = (char) (root+'A'-1);
    postTravel(sb, inArr[root][0]); // left
    postTravel(sb, inArr[root][1]); // right
    sb.append(temp); // root
}

public static void main(String[] args) throws IOException {
    // input
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer stk;
    int N = Integer.parseInt(br.readLine());
    for(int i = 0 ; i<2; i++)
        Arrays.fill(inArr[i], -1);
    for(int i = 0 ; i<N;i++) {
        stk = new StringTokenizer(br.readLine(), " ");
        int a = stk.nextToken().charAt(0)-'A' +1; // index 1번부터 사용
        int b = stk.nextToken().charAt(0)-'A' +1;
        int c = stk.nextToken().charAt(0)-'A' +1;
        inArr[a][0] = b; inArr[a][1] = c;
    }
    // run
    StringBuilder sb = new StringBuilder();
    preTravel(sb, 1); sb.append('\n');
    inTravel(sb, 1); sb.append('\n');
    postTravel(sb, 1); sb.append('\n');
    // output
    System.out.println(sb);
}



느낀점

생략

댓글남기기