[SWEA] 7985. Rooted Binary Tree 재구성

KwangYong·2022년 5월 26일
0

SWEA

목록 보기
2/17

📌 문제 7985

 import java.util.*;
 import java.lang.Math;
 class Solution
    {
        public static void main(String args[]) throws Exception
        {
            Solution Sol= new Solution();
            Scanner sc = new Scanner(System.in);
            int T;
            T=sc.nextInt();
            for(int test_case = 1; test_case <= T; test_case++)
            {
                //완전 이진 트리를 중위 순회 순서를 알려주기 떄문에
                // 항상 가운데 인덱스가 루트 노드라는게 보장된다.
                //재귀호출로 루트 노드를 계속 구해가는 식으로 이진 트리를 재구성할 수 있다.
                //루트 노드로 트리의 레벨별 요소를 구성해나간다.
                int k = sc.nextInt();
                int n = (int)Math.pow(2, k) - 1; //정점의 개수
                //중위 순회한 순서를 입력한 배열이 필요해
                int[] node = new int[n];
                for (int i = 0; i < n; i++) {
                    node[i] = sc.nextInt(); // 3 2 7 5 6 1 4
                }
                //Level 별로 왼쪽부터 출력할 배열이 필요
                //이 배열은 인덱스 1~n까지 필요하다. 재귀에서 루트노드를 계속 찾아가기 떄문에,
                //레벨별로 갯수가 2^(L-1)로 늘어나기 때문에 그 갯수를 맞춰서 tree 배열에
                //넣을려면 레벨별로 인덱스 *2로 맞춰줘야한다.
                int[] tree = new int[n + 1];
                Sol.DFS(0, n-1, 1, 0, tree, node);

                System.out.print("#" + test_case + " ");
                int num  =0 ;
                int i = 1;
                for (int level = 0; level < k; level++) {
                    num += (int)Math.pow(2, level);
                    for (; i <= num; i++) {
                        System.out.print(tree[i] + " ");
                    }
                    System.out.println();
                }
            }
        }
        public void DFS(int left, int right, int treeIndex, int nodeIndex, int[] tree, int[] node){
            int root = (left+right)/2;
            tree[treeIndex] = node[root];

            if(left == right) return;
            //왼쪽부분에 대해서 루트 노드를 구하는 재귀 호출
            DFS(left, root-1, treeIndex * 2, root, tree, node);
            //오른쪽 부분에 대해서 루트 노드를 구하는 재귀 호출
            DFS(root+1, right, treeIndex * 2 + 1, root, tree, node);
        }
    }

참고 코드: 벨로그

👨🏻‍💻 완전 이진 트리를 중위 순회 순서를 알려주기 떄문에 항상 가운데 인덱스가 루트 노드라는게 보장된다.재귀호출로 루트 노드를 계속 구해가는 식으로 이진 트리를 재구성할 수 있다.
루트 노드로 트리의 레벨별 요소를 구성해나간다.

profile
바른 자세로 코딩합니다 👦🏻💻

0개의 댓글