본문 바로가기
Blog/TIL

[240617] 트리

by 코젼 2024. 6. 17.
728x90
반응형

🔶트리


목차

    / 오늘의 TIL /


    트리

    이진트리

    • 배열: 메모리 낭비 주의
    • 포인터: 인덱스 연산을 하지 않으므로 메모리 공간을 낭비하지 않지만 실제 노드를 따라가도록 구현해야 하므로 구현 난이도는 배열보다 높다.
    • 인접 리스트:메모리 공간이 크게 낭비되지 않고 이동할 수 있는 다음 정점을 빠르게 탐색할 수 있어 시간 복잡도 면에서 이점이 많다. 자주 이용된다.

    메모리가 넉넉하다면 배열로 저장해도 괜찮다.

    • 루트 노드: 배열 인덱스 1번에 저장
      • 왼쪽 자식 노드: 부모 노드 배열 인덱스 * 2
      • 오른쪽 자식 노드: 부모 노드 배열 인덱스 * 2 + 1
    • 루트 노드: 배열 인덱스 0번에 저장
      • 왼쪽 자식 노드: 부모 노드 배열 인덱스 * 2 + 1
      • 오른쪽 자식 노드: 부모 노드 배열 인덱스 * 2 + 2

    순회

    • 전위 순회
    • 중위 순회
    • 후위 순회 (트리 삭제에 자주 활용됨)
    public class Solution {
    
        public static String[] solution(int[] nodes) {
            String[] result = new String[3];
            result[0] = preorder(nodes, 0).trim(); //마지막 공백 제거
            result[1] = inorder(nodes, 0).trim(); //마지막 공백 제거
            result[2] = postorder(nodes, 0).trim(); //마지막 공백 제거
            return result;
        }
    
        //전위 순회
        private static String preorder(int[] nodes, int idx) {
            //idx가 범위를 벗어나면 빈 문자열 반환
            if (idx >= nodes.length) return "";
    
            //루트 노드 -> 왼쪽 서브 트리 -> 오른쪽 서브 트리 순으로 재귀 호출하여 결과를 이어 붙임
            return nodes[idx] + " " +
                    preorder(nodes, 2*idx+1) +
                    preorder(nodes, 2*idx+2);
        }
    
        //중위 순회
        private static String inorder(int[] nodes, int idx) {
            //idx가 범위를 벗어나면 빈 문자열 반환
            if (idx >= nodes.length) return "";
    
            //왼쪽 서브 트리 -> 루트 노드 -> 오른쪽 서브 트리 순으로 재귀 호출하여 결과를 이어 붙임
            return inorder(nodes, 2*idx+1) +
                    nodes[idx] + " " +
                    inorder(nodes, 2*idx+2);
        }
    
        //후위 순회
        private static String postorder(int[] nodes, int idx) {
            //idx가 범위를 벗어나면 빈 문자열 반환
            if (idx >= nodes.length) return "";
    
            //왼쪽 서브 트리 -> 오른쪽 서브 트리 -> 루트 노드 순으로 재귀 호출하여 결과를 이어 붙임
            return postorder(nodes, 2*idx+1) +
                    postorder(nodes, 2*idx+2) +
                    nodes[idx] + " ";
        }
    
        public static void main(String[] args) {
            int[] nodes = {1,2,3,4,5,6,7};
            //["1 2 4 5 3 6 7"], ["4 2 5 1 6 3 7"], ["4 5 2 6 7 3 1"]
            String[] solution = solution(nodes);
            for (String s : solution) {
                System.out.println(s);
            }
        }
    }
    

     


    코딩테스트

    조건에 따라 값을 증가시키고 싶을 때 (+1) 반복문

    class Solution
    {
        public int solution(int n, int a, int b)
        {
            int answer;
            
            for (answer = 0; a != b; answer++) {
                a = (a+1) / 2;
                b = (b+1) / 2;
            }
            return answer;
        }
    }
    728x90
    반응형

    'Blog > TIL' 카테고리의 다른 글

    [240619] Mockito  (0) 2024.06.19
    [240618] 트리 + 해시맵  (0) 2024.06.18
    [240616] 문자열 자르기  (0) 2024.06.16
    [240614] stream, lombok  (0) 2024.06.14
    [240613] java8 stream  (0) 2024.06.13

    댓글