트리란 스택이나 큐와 같은 선형 구조가 아닌 비선형 구조이고 계층적 관계(Hierachical Relationship)을 표현하는 자료구조이다.
트리 순회 방식은 총 4가지이다.
루트 노드 먼저 방문하는 순회 방법이다.
트리에서 루트에서 시작하여 루트 노드 -> 왼쪽 하위 트리 -> 오른쪽 하위 트리
순서로 순회하는 방법이다.
위의 높이가 2인 트리를 예를 들면 1 -> 2 -> 3
이다.
초록색 노드를 가진 높이가 4인 트리를 전위 순회하면 순서는 아래와 같다.
1 -> 2 -> 4-> 8 -> 9 -> 5 -> 10 -> 11 -> 3 -> 6 -> 13 -> 7 -> 14
왼쪽 하위 트리를 먼저 방문 후 루트 노드, 오른쪽 하위 트리를 방문하는 순회 방법이다.
트리에서 루트에서 시작하여 왼쪽 하위 트리 -> 루트 노드 -> 오른쪽 하위 트리
순서로 순회하는 방법이다.
위의 높이가 2인 트리를 예를 들면 2 -> 1 -> 3
이다.
초록색 노드를 가진 높이가 4인 트리를 중위 순회하면 순서는 아래와 같다.
8 -> 4 -> 9 -> 2 -> 5 -> 10 -> 11 -> 1 -> 6 -> 13 -> 3 -> 7 -> 14
왼쪽부터 하위 트리들을 먼저 모두 방문 후 루트 노드를 방문하는 순회 방법이다.
트리에서 루트에서 시작하여 왼쪽 하위 트리 -> 오른쪽 하위 트리 -> 루트 노드
순서로 순회하는 방법이다.
위의 높이가 2인 트리를 예를 들면 2 -> 3 -> 1
이다.
초록색 노드를 가진 높이가 4인 트리를 중위 순회하면 순서는 아래와 같다.
8 -> 9 -> 4 -> 10 -> 11 -> 5 -> 2 -> 13 -> 6 -> 14 -> 7 -> 3 -> 1
루트 노드부터 계층별로 방문하는 방법이다.
위의 높이가 2인 트리를 예를 들면 1 -> 2 -> 3
이다.
초록색 노드를 가진 높이가 4인 트리를 중위 순회하면 순서는 아래와 같다.
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8 -> 9 -> 10 -> 11 -> 13 -> 14
모든 노드의 차수가 2 이하인 트리를 말한다.
기본적으로 위와 같은 형태를 띈다. 이진 트리도 형태에 따라 다양한 이진트리가 존재한다.
위 그림과 같이 모든 레벨이 꽉 찬 이진 트리를 포화 이진 트리하고 한다.
위 그림과 같이 단말노드를 제외한 모든 노드가 위에서 아래로, 왼쪽에서 오른쪽으로 차곡차곡 채워진 이진트리를 완전 이진 트리라고 한다.
위 그림과 같이 모든 노드가 0개 또는 2개의 자식 노드만을 가지고 있는 트리를 정 이진 트리라고 한다.
배열에서의 이진 트리
배열에서 이진트리의 노드 개수가 n개이고 루트 노드가 1에서 시작할 때, i번째 노드에 대해 부모 노드, 자식 노드의 index는 아래와 같다.parent(i) = i / 2 left_child(i) = 2i right_child(i) = 2i+1
효율적으로 탐색이 가능하고, 이를 위해 효율적으로 저장하는 방법을 고안한 자료구조이다.
이진 탐색 트리는 이진 트리의 한 종류이고, 데이터를 저장하는 규칙이 있다.
중복이 없는 이유?
중복이 많은 경우에 트리를 사용하여 검색 속도를 느리게 할 필요가 없다.
트리에 삽입하는 것보다 노드에 count 값을 가지게 하여 처리하는 것이 효율적이다
Big-O(log n)
Big-O(n)
편향 트리
데이터를 계속 추가하다 보면 지속적으로 한쪽으로만 노드가 추가될 수 있다. 이러면 데이터가 한쪽으로만 몰리는 편향트리가 된다. 이 경우에 균형을 잡기 위한 재조정(Rebalacing
)을 수행해야 한다. 이 기법을 구현한 트리 중 하나가Red-Black Tree
이다.
50, 15, 62, 70, 7, 54, 11
위의 숫자를 순서대로 이진 검색 트리에 삽입하면 아래와 같은 순서로 수행된다.
삭제는 3가지의 경우로 나누어 수행합니다.
1. 삭제할 노드가 리프 노드일 경우
2. 삭제할 노드에 자식이 하나만 있는 경우
3. 삭제할 노드에 자식이 둘 있는 경우
참고
한재엽님 Github Interview_Question_for_Beginner
gyoogle님 Github tech-interview-for-developer
http://www.ktword.co.kr/test/view/view.php?no=4726
https://yoongrammer.tistory.com/71