트리

  1. ㅇ롱클래스와 참조를 이용한 방식

각 노드를 객체로 만들고, 자식 노드를 참조(주소값)로 연결하는 형태입니다.

  • 장점 :

    • 트리의 모양이나 크기에 제약이 없어 매우 유연함

    • 노드의 추가, 삭제가 비교적 자유롭다.

    • 재귀 함수를 사용한 순회(Traversal) 로직을 직관적으로 구현 할 수 있다.

class TreeNode {
    int val; //노드의 값
    TreeNode left; // 왼쪽 자식 노드를 가리키는 참조
    TreeNode right; // 오른쪽 자식 노드를 가리키는 참조
    
    // 생성자
    TreeNode(int val) {
        this.val = val;
        }
    }
}
  1. 배열/ArrayList를 이용한 방식

이 방식은 주로 완전 이진 트리(Complete Binary Tree)나 힙(Heap)과 같은 특정 형태의 트리를 표현할 때 매우 효율적입니다.

배열의 인덱스를 이용해 부모-자식 관계를 정의합니다.

  • 인덱스 i에 있는 노드의:

    • 부모 노드 인덱스: (i - 1) / 2

    • 왼쪽 자식 노드 인덱스: 2 * i + 1

    • 오른쪽 자식 노드 인덱스: 2 * i + 2

  • 장점:

    • 완전 이진 트리의 경우, 포인터 메모리 없이 데이터를 빽빽하게 저장할 수 있어 공간 효율이 좋습니다.

    • 인덱스 계산만으로 부모/자식 노드에 빠르게 접근할 수 있습니다.

  • 단점:

    • 트리가 한쪽으로 치우치는 등 모양이 불규칙하면 사용하지 않는 인덱스가 많아져 심각한 공간 낭비가 발생합니다.

    • 노드의 추가, 삭제가 번거로울 수 있습니다.

배열로 표현한 이진 트리를 순회하는 코드

DFS(재귀(스택))을 이용한 순회

전위 : 트리 구성, 직렬화, 루트 우선 방문

중위 : BST 정렬/탐색 문제 -> BST를 중위 순회 하면 오름차순으로 정렬된 채로 출력됨.

후위 : 자식 먼저 처리해야 되는 문제 (트리 조건 확인, DP 삭제 등)

chevron-right연습문제) 길찾기 게임hashtag

https://school.programmers.co.kr/learn/courses/30/lessons/42892arrow-up-right

y,x 기반 정렬

-> tree 만들기

-> 전위, 후위 출력

BFS(너비 우선 탐색), 레벨 순서 순회(Level-order-traversal)

핵심 아이디어 : 큐(Queue)의 사용

  1. 큐에 루트 노드를 넣는다.

  2. 큐가 빌 때까지 다음을 반복한다.

    1. 큐에서 노드를 하나 꺼낸다 (Dequeue)

    2. 꺼낸 노드를 방문(처리)한다.

    3. 꺼낸 노드의 왼쪽 자식이 있다면 큐에 넣는다. (Enqueue)

    4. 꺼낸 노드의 오른쪽 자식이 있다면 큐에 넣는다. (Enqueue)

chevron-right양 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/92343arrow-up-righthashtag

제약 조건 : 내가 모은 양의 수보다 늑대의 수가 같거나 더 많으면 안됨.

탐색 방법 : 일반적인 트리 순회 (부모 -> 자식)과 다르다. 방문한 노드에 인접한 모든 노드가 다음 방문 대상 후보가 된다.

BFS 풀이

visited 집합이 각 Info 객체마다 독립적으로 관리된다.

now.visited.addAll(tree[now.node])를 통해 현재 노드의 이웃 노드들을 visited 집합에 추가하고 for(int next : now.visited) 루프를 통해 이 visited 집합의 모든 노드를 다음 탐색 대상으로 고려한다.

chevron-right표현 가능한 이진 트리 : https://school.programmers.co.kr/learn/courses/30/lessons/150367arrow-up-righthashtag

Last updated