◎ Tree
-
Tree
- 그래프의 여러 구조 중 단방향 그래프의 한 구조로, 하나의 뿌리로부터 가지가 사방으로 뻗은 형태
- 데이터가 바로 아래에 있는 하나 이상의 데이터에 무방향으로 연결된 계층적 자료구조
-
Tree의 노드와 노드사이 관계
- 루트(Root) : 트리에 있는 단 하나의 꼭짓점 데이터
- 간선(edge) : 데이터를 연결하는 것
- 노드(Node) : 각 데이터를 일컫음
- 부모 노드(Parent Node), 자식 노드(Child Node)
: 위 그림에서 5 - 3 관계를 보자
- 5 는 3 의 부모 노드(Parent Node) 이다.
- 3 은 5 의 자식 노드(Child Node) 이다.
- 리프 노드(Leaf Node) : 자식 노드가 없는 노드
-
Tree의 용어
- 깊이(depth) : 루트로부터 하위 계층의 특정 노드까지의 깊이(depth)
- 레벨(Level) : 같은 깊이를 가지고 있는 노드를 묶어서 레벨(level)로 표현
- 높이(Height) : 리프 노드를 기준(0)으로 루트까지의 높이(height), 자식 노드가 여러개일 경우, 숫자가 큰것을 기준
ex) 10 : 높이 2
- 서브 트리(Sub tree)
- 트리 구조의 root에서 뻗어 나오는 큰 트리의 내부에, 트리 구조를 갖춘 작은 트리
-
적합한 상황 (실사용 예제)
- 폴더 구조
- C드라이브 부터 시작해서 폴더는 계속 하위 폴더를 가질 수 있다.
- 월드컵 토너먼트 대진표, 가계도(족보), 조직도 등.
-
Tree 구조 간략적인 구현
public class App {
private String value;
private ArrayList<App> children;
}
◎ Graph
-
Graph(그래프)
- 여러개의 점들이 서로 복잡하게 연결되어 있는 관계를 표현한 자료구조
ex) 거미줄처럼 여러 개의 점들이 선으로 이어져 있는 복잡한 네트워크망
-
그래프 구조 및 용어
- 정점 (vertex): 노드(node)라고도 하며 데이터가 저장되는 그래프의 기본 원소
- 간선 (edge): 정점 간의 관계를 나타냄 (정점을 이어주는 선)
- 인접 정점 (adjacent vertex): 하나의 정점에서 간선에 의해 직접 연결되어 있는 정점
- 가중치 그래프 (weighted Graph): 연결의 강도(추가적인 정보)가 얼마나 되는지 적혀져 있는 그래프
- 비가중치 그래프 (unweighted Graph): 연결의 강도가 적혀져 있지 않는 그래프 (0, 1로만 구성)
- 무(방)향 그래프 (undirected graph): 앞서 보았던 내비게이션 예제는 무(방)향 그래프입니다. 서울에서 부산으로 갈 수 있듯, 반대로 부산에서 서울로 가는 것도 가능합니다. 하지만 단방향(directed) 그래프로 구현된다면 서울에서 부산을 갈 수 있지만, 부산에서 서울로 가는 것은 불가능합니다(혹은 그 반대). 만약 두 지점이 일방통행 도로로 이어져 있다면 단방향인 간선으로 표현할 수 있습니다.
- 진입차수 (in-degree) / 진출차수 (out-degree): 한 정점에 진입(들어오는 간선)하고 진출(나가는 간선)하는 간선이 몇 개인지를 나타냅니다.
- 인접 (adjacency): 두 정점 간에 간선이 직접 이어져 있다면 이 두 정점은 인접한 정점이다.
- 자기 루프 (self loop): 정점에서 진출하는 간선이 곧바로 자기 자신에게 진입하는 경우 자기 루프를 가졌다 라고 표현, 다른 정점을 거치지 않는다는 것이 특징
- 사이클 (cycle): 한 정점에서 출발하여 다시 해당 정점으로 돌아갈 수 있다면 사이클이 있다고 표현
-
인접 행렬
- 두 정점을 바로 이어주는 간선이 있다면 이 두 정점은 인접하다고 한다
- 두 정점이 이어져 있다면 1(true), 이어져 있지 않다면 0(false)으로 표시한 일종의 표
- 만약 가중치 그래프라면 1 대신 관계에서 의미 있는 값을 저장
- 인접 행렬을 사용하는 상황
- 두 정점 사이에 관계가 있는지, 없는지 확인하기에 용이
- 가장 빠른 경로(shortest path)를 찾고자 할 때 주로 사용
-
인접 리스트
- 각 정점이 어떤 정점과 인접하는지를 리스트의 형태로 표현
- 각 정점마다 하나의 리스트를 가지고 있으며, 이 리스트는 자신과 인접한 다른 정점을 담고 있다.
- 각 리스트마다의 순서는 보통 중요하지 않다. 정점별로 살펴봐야 할 우선 순위를 고려해 구현 (예외는 존재 가능)
- 인접 리스트를 사용하는 상황
- 메모리를 효율적으로 사용하고 싶을 때 인접 리스트를 사용
(접 행렬은 연결 가능한 모든 경우의 수를 저장하기 때문에 상대적으로 메모리를 많이 차지)
-
Graph의 실사용 예제
- SNS에서 사람들과의 관계, 내비게이션 (길 찾기) 등에서 사용
◎ Binary Search Tree