트리 - 계층적 구조.
한개 이상의 노드로 이루어진 유한 집합
노드 - 트리의 구성요소중 하나
류트 - 부모노드
서브트리 - 자식노드
간선 - 루트와 서브트리를 연결한 선
조상노드 - 루트에서 임의의 노드까지의 경로
단말노드 - 자식이 없는 노드(leap node) != 비단말 노드
노드의 차수 - 어떤 노드가 가진 자식노드의 개수
트리의 차수 - 트리가 가진 노드의 차수 중 가장 큰 차수
레벨 - 트리의 각 층에 번호를 매기는 것
트리의 높이 - 트리가 가진 최대 레벨
포리스트 - 트리의 집합
이진트리
- 모든 노드가 2개의 서브 트리를 갖는 트리
- 서브트리는 서로 공집합일수 있다.
* 공집합 : 원소를 하나도 갖지 않는 집합, 공집합은 모든 집합의 부분집합이다.
- 최대 2개의 자식노드를 가지수 있다.
- 모든 노드의 차수가 2 이하이다.
- 공집합도 이진트리이다.
- 서브트리간에 순서가 존재한다.
- 왼쪽 서브트리와 오른쪽 서브트리는 서로 구별된다.
* 이진트리의 정의 : 공집합이거나, 루트와 왼쪽, 오른쪽 서브트리로 구성된 노드들의 유한집합으로 정의한다.
이진 트리의 서브 트리들은 모두 이진트리여야 한다.
이진트리의 성질
- n개의 노드를 가진 이진트리는 n-1개의 간선을 갖는다.
- 높이가 h인 트리의 전체 노드의 개수는 (2^h) -1이 된다.
- 레벨당 최소 하나의 노드는 있어야 하기 때문에 높이(h)가 노드의 개수(n)를 넘을 수 없다.
1) 포화이진트리 : 각 레벨의 노드가 꽉 찬 상태
각 노드에 번호를 붙일 수 있다.
레벨 단위로 왼쪽에서 오른쪽으로 번호를 붙인다.
2) 완전이진트리 : 마지막 레벨에서 노드가 꽉 차있지 않아도 되지만 중간에 빈곳이 있어선 안된다.
3) 기타이진트리 : 그 외
이진 트리의 표현
1) 배열 표현 : 배열의 0번지 요소는 사용되지 않는다. 저장공간의 낭비가 심할수 있다.
노드 i 의 부모 노드 인덱스 i/2
노드 i 의 왼쪽 자식노드 인덱스 2i
노드 i 의 오른쪽 자식노드 인덱스 2i+1
2) 링크 표현 : 노드가 구조체로 표현되고 각 노드가 포인터를 가지고 있어서 표인터를 이용해 노드끼리 연결.
* 링크법으로 생성된 이진 트리
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
typedef struct TreeNode {
int data;
struct TreeNode *left, *right;
} TreeNode;
void main()
{
TreeNode *n1, *n2, *n3;
n1 = (TreeNode *)malloc(sizeof(TreeNode));
n2 = (TreeNode *)malloc(sizeof(TreeNode));
n3 = (TreeNode *)malloc(sizeof(TreeNode));
n1->data = 10;
n1->left = n2;
n1->right = n3;
n2->data = 20;
n2->left = NULL;
n2->right = NULL;
n3->data = 30;
n3->left = NULL;
n3->right = NULL;
}