Node (노드) : 트리를 구성하고 있는 각각의 요소를 의미한다.
Edge (간선) : 트리를 구성하기 위해 노드와 노드를 연결하는 선을 의미한다.
Root Node (루트 노드) : 트리 구조에서 최상위에 있는 노드를 의미한다.
Terminal Node ( = leaf Node, 단말 노드) : 하위에 다른 노드가 연결되어 있지 않은 노드를 의미한다.
Internal Node (내부노드, 비단말 노드) : 단말 노드를 제외한 모든 노드로 루트 노드를 포함한다.
트리 자료구조는 일반적으로 대상 정보의 각 항목들을 계층적으로 구조화할 때 사용하는 비선형 자료구조이다.
트리의 구조는 '데이터 저장'의 의미보다는 '저장된 데이터를 더 효과적으로 탐색'하기 위해서 사용된다.
리스트와 다르게 데이터가 단순히 나열되는 구조 X --> 트리는 부모(parent)와 자식(child)의 계층적인 관계로 표현된다.
트리는 사이클이 없다. (만약 사이클이 만들어진다면, 그것은 트리가 아니고 그래프다)
트리에서 루트노드를 제외한 모든 노드는 단 하나의 부모노드를 가진다.
트리를 순회하는 방식은 총 4가지
(Root → 왼쪽 자식 → 오른쪽 자식)
1 → 2 → 4 → 8 → 9 → 5 → 10 → 11 → 3 → 6 → 13 → 7 → 14
(왼쪽 자식 → Root → 오른쪽 자식)
8 → 4 → 9 → 2 → 10 → 5 → 11 → 1 → 6 → 13 → 3 →14 → 7
(왼쪽 자식 → 오른쪽 자식 → Root)
8 → 9 → 4 → 10 → 11 → 5 → 2 → 13 → 6 → 14 → 7 → 3 → 1
1 → 2 → 3 → 4 → 5 → 6 → 7 → 8 → 9 → 10 → 11 → 13 → 14
트리 자료구조는 여러 가지 유형이 있는데, 그중 가장 기본이 되는 트리는 이진 트리(Binary Tree) 구조이다.
이진 트리는 2개 이하의 자식노드를 가진다. (자식노드가 없거나 1개의 자식노드만 가지는 것도 가능!)
2개의 자식노드 중에서 왼쪽의 노드를 Left Node라고 하고, 오른쪽의 노드를 Right Node라고 한다.
트리에서는 각 층별로 숫자를 매겨서 이를 트리의 Level(레벨)이라고 한다. 레벨의 값은 0 부터 시작하고 따라서 루트 노드의 레벨은 0 이다. 그리고 트리의 최고 레벨을 가리켜 해당 트리의 height(높이)라고 한다.
모든 레벨이 꽉 찬 이진 트리를 가리켜 포화 이진 트리라고 한다. 위에서 아래로, 왼쪽에서 오른쪽으로 순서대로 차곡차곡 채워진 이진 트리를 가리켜 완전 이진 트리라고 한다. 모든 노드가 0개 혹은 2개의 자식 노드만을 갖는 이진 트리를 가리켜 정 이진 트리라고 한다. 배열로 구성된 Binary Tree는 노드의 개수가 n 개이고 root가 0이 아닌 1에서 시작할 때, i 번째 노드에 대해서 parent(i) = i/2 , left_child(i) = 2i , right_child(i) = 2i + 1 의 index 값을 갖는다.
사향 이진 트리 (Skewed Binary Tree) : linked list처럼 한 줄로 연결되어 있는 형태의 이진 트리
이진탐색트리의 목적은?
이진탐색 + 연결리스트
이진탐색 : 탐색에 소요되는 시간복잡도는 O(logN), but 삽입,삭제가 불가능
연결리스트 : 삽입, 삭제의 시간복잡도는 O(1), but 탐색하는 시간복잡도가 O(N)
이 두가지를 합하여 장점을 모두 얻는 것이 '이진탐색트리'
즉, 효율적인 탐색 능력을 가지고, 자료의 삽입 삭제도 가능하게 만들자
중복이 없어야 하는 이유는?
검색 목적 자료구조인데, 굳이 중복이 많은 경우에 트리를 사용하여 검색 속도를 느리게 할 필요가 없음. (트리에 삽입하는 것보다, 노드에 count 값을 가지게 하여 처리하는 것이 훨씬 효율적)
원하는 값을 찾을 때까지 현재의 노드값보다 찾고자하는 값이 작으면 왼쪽으로 움직이고, 크면 오른쪽으로 움직인다. 이렇게 원하는 값을 더 빠르게 찾을 수 있게 된다.
AVL 트리는 스스로 균형을 잡는 이진 탐색 트리이다.
트리의 높이가 h일때 이진탐색트리의 시간 복잡도는 O(h)이다.
한쪽으로 치우친 편향 이진트리가 되면 트리의 높이가 높아지기 때문에 이를 방지하고자 높이 균형을 유지하는 AVL트리를 사용한다.
레드 블랙 트리도 스스로 균형을 잡는 이진 탐색 트리이다.
-이진 탐색 트리의 속성을 가진다
z 노드를 삽입하면 v노드와 같은 빨간색으로 double red가 발생한다.
조건에 안맞음! -> Restructuring && Recoloring 두가지 방법 중 하나를 선택해야한다.
선택하는 기준은 부모의 형제(uncle) 노드 -> w가 빨간색이냐 검정색이냐이다.
w가 검정 -> Restructing 빨강 -> Recoloring
-> 레드블랙트리에 삽입(insertion)하는경우, Restructuring을 하든, Recoloring을 하든 O(logn)이 걸린다.
왜 red_black tree가 밸런스한지?
가장 짧은 경우와 가장 긴 경우를 생각하면 됨 ->
가장 짧을 경우 검은색으로만 이뤄질 경우
가장 길 경우 검-빨-검-빨
=둘이 가장 크게 차이 날때는 2배 => 밸런스하다~
정수형에서 이진탐색트리를 이용하면 시간복잡도 O(logN)
하지만 문자열에서 적용했을 때, 문자열 최대 길이가 M이면 O(M*logN)이 된다.
트라이 활용하면 -> O(M)
문자열을 저장하고 효율적으로 탐색하기 위한 트리 형태의 자료구조이다.
출처
https://velog.io/@kimdukbae/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%A6%AC-Tree#%ED%8E%B8%ED%96%A5-%EC%9D%B4%EC%A7%84-%ED%8A%B8%EB%A6%AC-skewed-binary-tree
https://gyoogle.dev/blog/computer-science/data-structure/Binary%20Search%20Tree.html
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/DataStructure#graph
https://zeddios.tistory.com/237
https://yoongrammer.tistory.com/72#AVL_%ED%8A%B8%EB%A6%AC(Tree)_%EA%B0%9C%EB%85%90_%EB%B0%8F_%EA%B5%AC%ED%98%84
https://code-lab1.tistory.com/62
https://gyoogle.dev/blog/computer-science/data-structure/Trie.html
https://velog.io/@kimdukbae/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-%ED%8A%B8%EB%9D%BC%EC%9D%B4-Trie