- 트리는 계층적인 자료를 표현하는데 적합한 자료구조이다.
- 한 개 이상의 노드로 이루어진 유한 집합이다.
- 트리에는 사이클(cycle)이 존재할 수 없다.
- 사이클이 없는 하나의 연결 그래프, 방향성이 있는 비순환 그래프의 한 종류
- 그래프의 한 종류로 '최소 연결 트리'라고도 불린다.
- 하나의 노드는 루트(root)노드라 불리고 나머지 노드들은 서브 트리라고 불린다.
- 계층적인 구조에서 가장 높은 곳에 있는 노드가 바로 루트노드이다.
- 서브 트리 안에서도 가장 높은 노드는 루트이고 나머지 서브트리로 구성되어 있다.
- 트리에서 루트와 서브 트리는 선으로 연결된다. 이 선을 간선이라고 한다.
루트 노드(root node) : 부모가 없는 노드, 트리는 하나의 루트 노드만을 가진다.
단말 노드(leaf node) : 자식이 없는 노드
비단말 노드(nonterminal node) : 자식이 있는 노드, 내부 노드라고도 불림
간선(edge) : 노드를 연결하는 선
조상 노드 : 루트 노드에서 임의의 노드까지의 경로를 이루고 있는 노드들
후손 노드 : 임의의 노드 하위에 연결된 모든 노드들
형제 노드(siblng node) : 같은 부모를 가지는 노드
노드의 크기(size) : 자신을 포함한 모든 자손 노드의 개수
노드의 깊이(depth) : 루트에서 어떤 노드에 도달하기 위해 거쳐야 하는 간선의 수
노드의 레벨(level) : 트리의 특정 깊이를 가지는 노드의 집합(루트 노드부터 레벨 1)
노드의 차수(degree) : 어떤 노드가 가지고 있는 자식 노드의 개수(단말노드는 차수 0)
- 모든 노드가 2개의 서브 트리를 가지고 있는 트리
- 서브 트리는 공집합일 수 있다.
- 이진트리의 노드에는 최대 2개까지의 자식 노드가 존재할 수 있고 모든 노드의 차수가 2 이하가 된다.
- n개의 노드를 가진 이진트리는 정확하게 n-1개의 간선을 가진다.
- 높이가 h인 이진트리의 경우, 최소 h개의 노드를 가지며 최대 개의 노드를 가진다.
void preorder(TreeNode* root) { // 전위 순회 출력
if (root != NULL) {
printf("[%d] ", root->data);
preorder(root->left);
preorder(root->right);
}
}
중위 순회를 하는 코드는 다음과 같다.
void inorder(TreeNode* root) { // 중위 순회 출력
if (root != NULL) {
inorder(root->left);
printf("[%d] ", root->data);
inorder(root->right);
}
}
후위 순회를 하는 코드는 다음과 같다.
void postorder(TreeNode* root) { // 후위 순회 출력
if (root != NULL) {
postorder(root->left);
postorder(root->right);
printf("[%d] ", root->data);
}
}
- 레벨 순회(level order)는 각 노드를 레벨 순으로 검사하는 순회 방법이다.
- 레벨 순회는 큐를 사용하는 순회법이다.