트리는 그 모양이 뒤집어 놓은 나무와 비슷하다고 해서 이런 이름이 붙었다.
루트노드를 제외한 모든 노드는 단 하나의 부모노드만을 가짐으로 나오는 트리의 성질및 특징을 알아보자
이진트리란 자식노드가 최대 두 개인 노드들로 구성된 트리이다. 이진트리에는 정이진트리, 완전이진트리, 균형이진트리 등이 있다.
정이진트리 : 모든 레벨에서 노드들이 꽉 채워진(잎새 노드를 제외한 모든 노드가 자식노드를 2개 가짐)이진트리 이다.
- 레벨에 따른 노드의 숫자는 : level = k , 노드수 = 2^( k + 1) -1
완전이진트리 : 마지막 레벨을 제외한 모든 레벨에서 노드들이 꽉 채워진 이진트리
정이진트리와 완전 이진트리는 1차원 배열로도 표현이 가능하다.
어떤 노드의 인덱스를 index, 왼쪽 자식노드의 인덱스를 left_index, 오른쪽 자식노드의 인덱스를 right_index로 선언하면
left_index = 2 * index + 1
right_index = 2 * index + 2
트리 순회란 트리의 각 노드를 체계적인 방법으로 방문하는 과정을 말한다. 하나도 빠뜨리지 않고 , 정확히 한번만 중복없이 방문해야한다.
노드를 방문 하는 순서에 따라 전위순회(preorder), 중위순회(inorder), 후위순회(postorder)세가지로 나뉜다.
이진탐색과 연결리스트(linked list) 를 결합한 자료구조의 일종이다.
이진탐색의 효율적인 탐색 능력을 유지하면서도, 빈번한 자료 입력과 삭제를 가능하게끔 고안됐다.
예를들면 이진탐색의 경우 탐색에 소요되는 계산복잡성은 O(logN)으로 빠르지만 자료입력이나 삭제가 불가능하다.
연결 리스트의 경우 자료입력, 삭제에 필요한 계산 복잡성은 O(1)로 효율적이지만 탐색하는 데에는 O(n)의 계산 복잡성이 발생한다. 이 두개의 장점을 살려보는 것이 이진 탐색트리의 목적이라고 할 수 있다.
각 노드의 왼쪽 서브트리에는 해당 노드의 값보다 작은 값을 지닌 노드들로 이루어져 있다.
각 노드의 오른쪽 서브트리에는 해당 노드의 값보다 큰 값을 지닌 노드들로 이루어져 있다.
중복된 노드가 없어야 한다.
왼쪽 서브트리, 오른쪽 서브트리 또한 이진 탐색트리이다.
이진 탐색트리를 순회할 때에는 중위순회(inorder)방식을 사용한다.
- 왼쪽 서브트리 -> 노드 -> 오른쪽 서브트리 순으로
위의 그림에서 중위순회를 사용한다면, 순서는 1, 3, 5, 7, 8, 10 순서로 순회한다.
이진탐색트리의 핵심 연산은 검색(retreive), 삽입(insert), 삭제(delete) 이 세가지 이다. 이밖에 생성(create), 이진탐색트리 삭제(destroy), 해당 이진 탐색 트리가 비어 있는지 확인(isEmpty), 트리순회(tree traversal)의 연산들이 있다.