정보의 항목들이 가지로 연결될 수 있게 데이터가 조직되는 1개 이상의 노드로 구성된 유한집합
노드 : 트리를 구성하는 요소
루트노드 : 가장 높은 곳에 있는 노드
서브트리 : 루트노드를 제외한 나머지 노드
간선 : 루트와 서븥리를 연결한 선
부모노드 : 한 노드와 간선이 이어진 윗 노드
자식노드 : 한 노드와 간선이 이어진 아랫노드
형제노드 : 같은 레벨, 동일한 부모노드를 가지는 노드
조상노드 : 루트에서 그 노드까지의 경로상에 있는 모든 노드
후손노드 : 그 노드의 서브트리에 있는 모든 노드
단말 노드 : 차수가 0인 노드
노드의 차수 : 노드의 서브트리 수
트리의 차수 : 노드 차수 중 최대값
레벨 : 루트의 레벨 = 1, 그 외 = 부모의 레벨 + 1
높이(깊이) : 트리에 있는 노드의 최대 레벨 값
포리스트 : n≥0개의 분리된 트리들의 집합트리에서 루트를 제거한 것
공백이거나,
루트와 왼쪽⋅오른쪽 서브트리라고 하는
2개의 분리된 이진트리로 구성된 노드의 유한집합

각 노드를 중복되지 않게 방문하는 것



모든 원소가 서로 다른 키 값을 지닌 트리이며 다음과 같은 특징을 가진다.
- 한 노드에 대해 왼쪽 서브트리엔 작은값, 오른쪽 서브트리엔 큰 값이 온다.
- 중위순회시 오름차순으로 정렬 된다.
- 탐색, 삽입, 삭제 연산의 시간복잡도는 O()이다.
NULL링크에 중위후속자를 저장시켜놓은 트리

가장 큰 or 작은 값을 빠르게 찾기위해 사용
- 힙트리: 각 노드가 부모노드와 자식노드간에 일정한 순서적 성질을 가지는 완전이진트리
- 최대힙: 최대트리(각 노드 키 값이 자식 키 값과 같거나 큰 트리) & 완전이진트리
- 최소힙: 최소트리(각 노드 키 값이 자식 키 값과 같거나 작은 트리) & 완전이진트리
void push(int item, int *n) {
int i;
if(HEAP_FULL(*n)) exit(1); //꽉 찼으면 종료
i = ++(*n);
while( (i!=1) && (item > heap[i/2]) ) {
heap[i] = heap[i/2]; //부모값을 자식으로 옮김
i/=2;
}
heap[i] = item;
}
int pop(int *n) {
int parent, child, item, temp;
if(HEAP_EMPTY(*n)) exit(1); //비어있으면 종료
item = heap[1]; //가장 큰 값(삭제할 원소)
temp = heap[(*n)--]; //마지막 원소값 저장
parent = 1; child = 2;
while(child <= *n) {
if((child < *n) && (heap[child] < heap[child+1]))
child++; //자식 중 더 큰값 선택
if(temp >= heap[child]) break;
heap[paraent] = heap[child]; //자식값을 부모로
parent = child; //아래단계로 이동
child *= 2; //아래단계로 이동
}
heap[parent] = temp;
return item;
}