
- 큐 (Queue), 순환 큐 (Circular Queue), 우선 순위 큐 (Priority Queue)
- 트리 (Tree), 이진 트리 (Binary Tree), 이진 탐색 트리 (Binary Search Tree)
- 힙 (Heap)

자료를 보관할 수 있는 선형 구조, 넣을 때 한 쪽 끝에서 넣고 (enqueue), 꺼낼 때에는 반대 쪽에서 뽑아 꺼내는 특성을 가짐 (dequeue). 선입선출(FIFO) 특징.
배열이나 연결리스트를 이용하여 구현할 수 있지만, 배열의 경우 dequeue에 O(n)의 복잡도를 갖기 때문에 이중 연결 리스트로 구현하는 것을 추천.
1. size() : 큐의 데이터 원소의 개수를 반환
2. isEmpty() : 큐가 비어 있는지를 판단
3. enqueue(x) : 데이터 x 를 큐에 추가
4. dequeue() : 큐의 맨 앞에 저장된 데이터 원소를 제거 (반환 o)
5. peek() : 큐의 맨 앞에 저장된 데이터 원소를 반환 (제거 x)

front와 rear 포인터를 사용하여 enqueue, dequeue 작업 수행. isFull() 연산을 추가한다.
<구현방법>
1. Enqueue 시 우선순위 순서를 유지하도록 구현, 2번보다 조금 더 유리
2. Dequeue 할 때 우선순위 높은 것을 선택하도록 구현

<트리 용어 정리>
루트(Root) 노드 : 최상위의 노드 : 1
리프(Leaf) 노드 : 자식이 없는 노드 : 3,5,6,7
내부(Internal) 노드 : 루트와 리프가 아닌 나머지 노드 : 2,,4
노드의 수준(Level) : 루트(level 0)를 기준으로 내려갈 때 마다 1 증가 : 5,6,7의 level은 2, (특정 노드까지 가는데 거쳐야하는 간선의 수를 나타냄)
트리의 높이(Height),깊이(Depth) : 최대 수준(level) + 1
노드의 차수(Degree) : 자식(서브트리)의 수



size() : 현재 트리에 포함되어 있는 노드의 수를 구함.
depth() : 현재 트리의 깊이(높이)를 구함
traversal() : 트리 순회
노드(Node) : Data + Left(왼쪽 자식) + Right(오른쪽 자식)root 설정size() = left subtree의 size() + right subtree의 size() + 1depth() = left subtree의 depth()와 right subtree의 depth() 중 더 큰 것에 + 1traversal() : 깊이 우선 순회 vs 넓이 우선 순회1. 중위 순회 (in-order) : left subtree -> 자기 자신 -> right subtree
2. 전위 순회 (pre-order) : 자기 자신 -> left subtree -> right subtree
3. 후위 순회 (post-order) : left subtree -> right subtree -> 자기 자신


데이터 표현 - 각 노드는 (key, value)의 쌍으로 구성, 키를 이용해서 검색 가능하고 보다 복잡한 데이터 레코드로 확장이 가능하다.
insert(key,data) : 트리에 주어진 데이터 원소를 추가
remove(key) : 특정 원소를 트리로부터 삭제
lookup(key) : 특정 원소를 검색
inorder() : 키의 순서대로 데이터 원소를 나열
min(), max() : 최소 키, 최대 키를 가지는 원소를 각각 탐색
insert(key,data) : 루트 부터 값을 비교해서 작으면 왼쪽, 크면 오른쪽으로 탐색해서 말단에 삽입
remove(key)
lookup(key)
inorder() : 이진 트리의 순회와 동일
min() : 왼쪽 서브트리의 min()을 재귀적으로 구현
max() : 오른쪽 서브트리의 max()를 재귀적으로 구현

max heap, min heap)insert(item) : 새로운 원소를 삽입
remove() : 최대 원소 (root node) 를 반환하고 삭제
노드 번호 m 을 기준으로
2 * m2 * m + 1m // 2insert(item)
1. 트리의 마지막 자리에 새로운 원소를 임시로 저장
2. 부모 노드와 키 값을 비교하여 위로, 위로 이동
remove()
1. 루트 노드의 제거 (최댓값 or 최솟값)
2. 트리 마지막 자리 노드를 임시로 루트 노드의 자리에 배치
3. 자식 노드들과의 값을 비교하면서 아래로, 아래로 이동
4. 자식이 둘 있다면 자식 중에서 더 큰 값과 변경
enqueue 할 때 "느슨한 정렬" 을 이루고 있도록 함 : O(log n)
dequeue 할 때 최댓값을 순서대로 추출 : O(log n)
정렬되지 않은 원소들을 아무 순서로나 최대 힙에 삽입 : O(log n)
삽입이 끝나면, 힙이 비게 될 때까지 하나씩 삭제 : O(log n)
원소들이 삭제된 순서가 원소들의 정렬 순서
정렬 알고리즘의 복잡도 : O(nlog n)
이진 탐색 트리에서의 노드 삭제 연산을 구현하는 예제가 조건문이 중첩되서 여러번 들어가기 때문에 생각할게 많아 어려웠던 것 같다.