트리(Tree) 구조
- 트리: Node와 Branch를 이용해서, 사이클을 이루지 않도록 구성한 데이터 구조
- 실제로 어디에 많이 사용되나?
- 트리 중 이진 트리 (Binary Tree) 형태의 구조로, 탐색(검색) 알고리즘 구현을 위해 많이 사용됨
- 알아둘 용어들
- Node: 트리에서 데이터를 저장하는 기본 요소 (데이터와 다른 연결된 노드에 대한 Branch 정보 포함)
- Root Node: 트리 맨 위에 있는 노드
- Level: 최상위 노드를 Level 0으로 하였을 때, 하위 Branch로 연결된 노드의 깊이를 나타냄
- Parent Node: 어떤 노드의 다음 레벨에 연결된 노드
- Child Node: 어떤 노드의 상위 레벨에 연결된 노드
- Leaf Node (Terminal Node): Child Node가 하나도 없는 노드
- Sibling (Brother Node): 동일한 Parent Node를 가진 노드
- Depth: 트리에서 Node가 가질 수 있는 최대 Level
이진트리(Binary Tree)와 이진 탐색 트리(Binary Search Tree)
- 이진 트리: 노드의 최대 Branch가 2인 트리
- 이진 탐색 트리 (Binary Search Tree, BST): 이진 트리에 다음과 같은 추가적인 조건이 있는 트리
- 왼쪽 노드는 해당 노드보다 작은 값, 오른쪽 노드는 해당 노드보다 큰 값을 가지고 있음
- 데이터 검색(탐색) 할 때에 주로 사용
- 장점: 탐색 속도를 개선 가능
- 단점:
=> 이진 트리와 이진 탐색 트리를 동일하다고 하기도 하지만, 차이가 있으니 알아둬야 한다고 하셨다.
이진트리와 이진 탐색 트리의 차이점, 이진 탐색 트리의 장점인 탐색 속도 개선에 관해서 설명만 보면 잘 이해가 되지 않는데
아래 참고자료의 gif 보면 잘 알 수 있다.
특히 탐색 속도 개선 관련해서 예시로 숫자 탐색 시 정렬된 배열에서 탐색하는 것과 비교하는 자료가 도움이 많이 됨...!ㅎㅎ
이런 시각적인 자료를 함게 곁들여서 설명해주시니까 너무 좋당
[참고자료] https://www.mathwarehouse.com/programming/gifs/binary-search-tree.php#binary-search-tree-insertion-node
5 Gifs to Understand Binary Search Trees
Gif #1 Gif #2 : Binary Search Tree from Sorted Array Gif #3 How insertion into a binary search tree (BST) works Gif #4 : Degeneration of Binary Search Tree Demonstration Gif #5 is coming ...
blog.penjee.com
그럼 이제 트리구조를.. 코드로 구현...
이진트리를 잘 보면, 하나의 노드는 그 데이터와 왼쪽 또는 오른쪽으로 나아가는 주소값을 가지고 있다고 볼 수 있다.
링크드리스트.. 더블 링크드 리스트..?!
1. 새로 넣을 값(value)와 현재 노드의 값(value)를 비교한다.
2. 새로운 값 < 현재 노드의 값 => 왼쪽으로, 새로운 값 >= 현재 노드의 값 => 오른쪽으로
3. 현재 노드의 왼쪽 또는 오른쪽에 값이 없으면 새로운 값으로 해당 위치에 노드를 만들고 종료
4. 현재 노드의 온쪽 또는 오른쪽에 값이 있으면 비교할 노드를 그 위치의 노드로 변경
class Node<T: Comparable> {
var value: T?
var left: Node?
var right: Node?
init(_ value: T, left: Node? = nil, right: Node? = nil) {
self.value = value
self.left = left
self.right = right
}
}
class BinarySearchTree<T: Comparable> {
// root node of Tree
var head: Node<T>?
// current Node
var node: Node<T>?
init(_ head: Node<T>? = nil) {
self.head = head
}
// insert value to tree
func insert(value: T) {
// first node == head(root node)
guard self.head != nil else {
return
}
self.node = self.head
while true {
if value < self.node!.value! {
// go left
if self.node?.left != nil {
// need to compare with left's node
self.node = self.node?.left
} else {
// current node's left is empty >> Make New Node with value
self.node?.left = Node(value)
break
}
} else {
// go right
if self.node?.right != nil {
// need to compare with right's node
self.node = self.node?.right
} else {
// current node's right is empty >> Make New Node with value
self.node?.right = Node(value)
break
}
}
}
}
}
// test
let head = Node(1)
// make tree with root node
let tree = BinarySearchTree(head)
// insert value to the tree tree.
tree.insert(value: 2)
오..!
새로운값 insert 까지 성공!!!!
오늘부터 트리 구조에 대해 공부했다.
어려워서 트리 언제끝나나 강의 목차 보는데 트리 1 부터 8까지..
오늘 수요일이니까.. 이번주 내내 트리 보고 보고 보고 보면.. 되나...? 휴우
일단 오늘 들은 내용은 지난주에 했던 Double Linked List와 비슷해서 걱정했던 것 만큼 어렵지는 않았던 것 같다.
방법만 이해하고 나니, Swift로 잘 짰다!
그럼 이제 insert 했으니까 데이터 출력하기.. 이건 내일해야겠다..ㅎㅎ
패스트캠퍼스 [직장인 실무교육]
프로그래밍, 영상편집, UX/UI, 마케팅, 데이터 분석, 엑셀강의, The RED, 국비지원, 기업교육, 서비스 제공.
fastcampus.co.kr
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
'알고리즘' 카테고리의 다른 글
[알고리즘] 패스트캠퍼스 챌린지 12일차 (0) | 2021.09.17 |
---|---|
[알고리즘] 패스트캠퍼스 챌린지 11일차 (0) | 2021.09.16 |
[알고리즘] 패스트캠퍼스 챌린지 09일차 (0) | 2021.09.14 |
[알고리즘] 패스트캠퍼스 챌린지 08일차 (0) | 2021.09.13 |
[알고리즘] 패스트캠퍼스 챌린지 07일차 (0) | 2021.09.12 |