// 이진 트리
// 이진 트리 개념
// 각 노드가 최대 두개의 자식 노드를 가지는 트리
// 이진 검색 트리 특징
// 왼쪽을 타고 가면 현재 값보다 작다.
// 오른쪽을 타고 가면 현재 값보다 크다
// 이진 검색 트리 문제
// 무식하게 추가하면 , 한쪽으로 기울어져서 균형이 깨진다. 트리 재배치를 통해 균형을 유지하는 것이 과제 (AVL, RED-BLACK)
// 리스트와 똑같아짐
// 힙트리
// 힙트리 특징
// 힙트리 1법칙 : 부모노드가 가진 값은 항상 자식 노드가 가진 값보다 크다.
// 힙트리 구조
// 마지막 레벨을 제외한 모든 레벨에 노드가 꽉 차있다.
// 마지막 레벨에 노드가 있을 때는 항상 왼쪽부터 채워야 한다.
// 힙트리 2법칙 : 노드 개수를 알면 트리 구조는 무조건 확정할 수 있다.
// 힙트리 구현
// 따라서 배열을 이용해서 힙구조를 바로 표현할 수 있다.
int[]heap = new int[5]
// i번 노드의 왼쪽 자식은 [(2*i)]+1] 번
// i번 노드의 오른쪽 자식은 [(2*i)]+2] 번
// i번 노드의 부모는 [(i-1)/2] // 소수점은 버림
// 새로운 값 추가
// 31추가
// 힙트리 2법칙 : 노드 개수를 알면 트리구조는 무조건 확정할 수 있다.
// 도장깨기 시작
// 최대값 꺼내기
// 힙트리 특성상 최대값은 무조건 루트 노드에 있는 값이다.
// 따라서 32를 꺼내보자
// 1단계 최대값을 먼저 제거한다.
// 힙트리 2법칙 노드 개수를 알면, 트리 구조는 무조건 확정할 수 있다.
// 2단계 제일 마지막에 위치한 데이터를 루트로 옮긴다.
// 부모 노드가 가진 값은 항상 자식노드가 가진 값보다 커야 된다.
// 역도장 깨기를 시작
이진 검색 트리 특징

이진 검색 트리 문제점

힙트리 구조



힙을 배열로 구현하면 다음과 같은 규칙이 성립합니다.
2 * i + 12 * i + 2(i - 1) / 2예제 트리 (최대 힙)
50
/ \
30 20
/ \ /
10 15 5
위의 트리는 배열로 표현하면:
int[] heap = {50, 30, 20, 10, 15, 5};
출력 결과
50
40, 30, 20, 10, 15, 5
(50 제거 후, 40이 루트로 올라가고 자리 교환)