Node와 Edge로 이루어진 자료구조
Tree의 특성을 이해하자
트리는 값을 가진 노드(Node)
와 이 노드들을 연결해주는 간선(Edge)
으로 이루어져있다.
그림 상 데이터 1을 가진 노드가 루트(Root) 노드
다.
모든 노드들은 0개 이상의 자식(Child) 노드를 갖고 있으며 보통 부모-자식 관계로 부른다.
아래처럼 가족 관계도를 그릴 때 트리 형식으로 나타내는 경우도 많이 봤을 것이다. 자료구조의 트리도 이 방식을 그대로 구현한 것이다.
트리는 몇 가지 특징이 있다.
가장 중요한 것은, 그래프
와 트리
의 차이가 무엇인가인데, 이는 사이클의 유무로 설명할 수 있다.
사이클이 존재하지 않는 그래프
라 하여 무조건 트리
인 것은 아니다 사이클이 존재하지 않는 그래프는 Forest
라 지칭하며 트리의 경우 싸이클이 존재하지 않고 모든 노드가 간선으로 이어져 있어야 한다
트리를 구성하고 있는 기본 요소
노드에는 키 또는 값과 하위 노드에 대한 포인터를 가지고 있음.
A, B, C, D, E, F, G, H, I, J
노드와 노드 간의 연결선
트리 구조에서 부모가 없는 최상위 노드
root node : A
자식 노드를 가진 노드
H, I에 부모 노드는 D
부모 노드의 하위 노드
노드 D의 자식 노드는 H, I
같은 부모를 가지는 노드
H, I는 같은 부모를 가지는 형제 노드
자식 노드가 없는 노드
H, I, J, F, G
자식 노드 하나 이상 가진 노드
A, B, C, D, E
루트에서 어떤 노드까지의 간선(Edge) 수
루트 노드의 깊이 : 0
D의 깊이 : 2
어떤 노드에서 리프 노드까지 가장 긴 경로의 간선(Edge) 수
리프 노드의 높이 : 0
A 노드의 높이 : 3
루트에서 어떤 노드까지의 간선(Edge) 수
노드의 자식 수
Leaf node의 degree : 0; A의 degree : 2
한 노드에서 다른 한 노드에 이르는 길 사이에 놓여있는 노드들의 순서
A & H 경로 : A-B-D-H
해당 경로에 있는 총노드의 수
A & H 경로 길이 : 4
자신을 포함한 자손의 노드 수
노드 B의 size : 6
레벨에 있는 노드 수
Level 2 width : 4
리프 노드의 수
Breadth : 5
두 노드 사이의 최단 경로에 있는 간선(Edge)의 수
D와 J의 Distance : 3
부모 노드가 가질 수 있는 최대 자식의 수
Order 3 : 부모 노드는 최대 3명의 자식을 가질 수 있다.
트리를 순회하는 방식은 총 4가지가 있다. 위의 그림을 예시로 진행해보자
각 부모 노드를 순차적으로 먼저 방문하는 방식이다.
(부모 → 왼쪽 자식 → 오른쪽 자식)
1 → 2 → 4 → 8 → 9 → 5 → 10 → 11 → 3 → 6 → 13 → 7 → 14
왼쪽 하위 트리를 방문 후 부모 노드를 방문하는 방식이다.
(왼쪽 자식 → 부모 → 오른쪽 자식)
8 → 4 → 9 → 2 → 10 → 5 → 11 → 1 → 6 → 13 → 3 →14 → 7
왼쪽 하위 트리부터 하위를 모두 방문 후 부모 노드를 방문하는 방식이다.
(왼쪽 자식 → 오른쪽 자식 → 부모)
8 → 9 → 4 → 10 → 11 → 5 → 2 → 13 → 6 → 14 → 7 → 3 → 1
부모 노드부터 계층 별로 방문하는 방식이다.
1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 13 → 14
public class Tree<T> {
private Node<T> root;
public Tree(T rootData) {
root = new Node<T>();
root.data = rootData;
root.children = new ArrayList<Node<T>>();
}
public static class Node<T> {
private T data;
private Node<T> parent;
private List<Node<T>> children;
}
}