이진 검색 트리 클래스는 BST의 루트 노드를 의미하는 한 개의 데이터 멤버와 Node 객체를 포함한다.
15
이진 검색 트리 클래스의 생성자에서는 루트 노드를 null로 설정하면서 빈 노드를 만든다.
16
insert() 함수를 구현하려면 먼저 데이터를 저장할 Node 객체를 만들어야 한다.
17
다음으로 BST의 루트 노드를 확인해야 한다. 루트 노드가 없으면 BST는 BST를 새로 만드는 상황이므로 현재 삽입하려는 노드가 루트 노드가 되며 insert() 함수의 동작이 끝난다. 루트가 있다면 다음 단계로 넘어간다.
18
삽입하려는 노드가 루트 노드가 아니면 BST를 탐색하면서 노드를 삽입할 위치를 찾아야 한다. insert() 함수는 BST 의 레벨을 바꿔가며 삽입 위치를 찾을 때 현재 노드에 할당된 Node 객체를 사용한다. insert() 함수는 BST의 루트 노드로 자신을 이동시킨 다음 작업을 시작한다.
19
이제 BST 내부에서 어느 위치에 노드를 삽입할 지 결정해야 한다. 삽입할 위치를 찾을 때까지 루프를 반복한다. 다음과 같은 방법으로 노드를 삽입할 위치를 결정한다.
1.루트 노드를 current 노드로 설정한다.
2.삽입할 노드의 값이 current 노드의 값보다 작으면 새로운 current 노드를 current 노드의 왼쪽 자식으로 설정한다. 삽입하려는 노드의 값이 current 노드의 값보다 크다면 4번 과정을 생략한다.
3.current 노드의 왼쪽 자식의 값이 null이면 새로운 노드를 왼쪽 자식으로 삽입한 다음 루프를 종료한다. current 노드의 왼쪽 자신의 값이 null이 아니면 다음 루프를 진행한다.
4.current 노드를 현재 노드의 오른쪽 자식으로 설정한다.
5.current 노드의 오른쪽 자식의 값이 null이면 새로운 노드를 현재 노드의 오른쪽 자식으로 설정하고 루프를 종료한다. current 노드의 오른쪽 자식의 값이 null이 아니면 다음 루프를 진행한다.
BST의 노드 삭제하기
BST에서 노드를 삭제하는 동작이 가장 복잡하며, 삭제하는 노드의 위치에 따라 노드 삭제 과정의 복잡도가 달라진다.
32
재귀를 이용하여 삭제.
1.현재 노드가 삭제할 데이터를 포함하고 있는지 확인.
2.현재 노드가 삭제할 데이터를 포함하면 노드를 삭제.
3.현재 노드가 삭제할 데이터를 포함하고 있지 않으면 현재 노드의 데이터와 삭제하려는 데이터의 크기를 비교한다.
4.삭제하려는 데이터가 현재 노드의 데이트보다 작으면 현재 노드의 왼쪽 자식 노드로 이동한 다음 다시 데이터를 비교한다. 삭제하려는 데이터가 현재 노드의 데이터보다 크면 현재 노드의 오른쪽 자식 노드로 이동한 다음 데이터를 비교한다.
5.노드를 삭제할 때 삭제하려는 노드가 리프 노드인지 확인해야 한다.
6.리프 노드를 삭제했으면 삭제된 노드를 가리키던 부모 노드의 링크를 null로 설정한다.
7.삭제하는 노드에 한 개의 자식이 있다면 삭제된 노드를 가리키던 링크를 삭제된 노드의 자식을 가리키도록 조정한다.
8.삭제하는 노드에 두 개의 자식이 있다면 삭제한 노드를 기준으로 왼쪽의 서브트리에서 가장 큰 값을 찾던지 아니면 오른쪽 서브트리에서 가장 작은 값을 찾아야 한다. 여기서는 오른쪽 서브트리의 가장 작은 값을 찾는 방법을 이용한다.
9.서브트리에서 가장 작은 값을 찾는 함수가 필요하다 이 함수를 이용해 가장 작은 값을 임시로 저장할 노드를 만들 것이다. 서브트리의 가장 작은 값을 우리가 교체하려는 노드로 복사한 다음 임시 노드를 삭제한다.
발견 횟수 계산
데이터 집합에서 어떤 데이터가 얼마나 분포하는지 확인할 때 BST를 활용할 수 있다. 예를 들어 BST를 이용해 시험 점수의 분포도를 저장할 수 있다. BST에 저장된 점수를 이용해 어떤 점수가 BST에 저장되어 있는지 여부를 확인한 다음 BST에 점수가 저장되어 있지 않으면 BST에 추가하고, BST에 점수가 저장되어 있을 때는 발견 횟수를 증가시킨다.
34
BST의 점수 발견 횟수를 저장할 수 있게 Node 객체에 필드를 추가해야 하며, BST에서 점수를 발견했을 때 발견 횟수를 저장하는 필드가 증가되도록 노드를 갱신하는 함수도 필요하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
function Node(data, left, right) {
this.data = data;
this.count =1; // 점수를 BST에 삽입하는 시점에는 count를 1로 설정. count 필드를 증가시킬 함수를 BST에 추가해야 한다.