1. AVL tree란?
AVL tree를 설명하기에 앞서, BST(이진탐색트리)에 대해 알고 있어야 하는데,이는 이전에 내가 작성 했던 글을 참고하면 BST에 대해 간단히 알수 있다.
이 블로그의 이전글 링크 :
이진탐색트리(BST) +(LeetCode 98, 99, 700, 701 풀이) - https://freakingeniousshawn.tistory.com/m/4
이진탐색트리(BST) +(LeetCode 98, 99, 700, 701 풀이)
1. 이진 탐색 트리(BST) 이진탐색트리에는 아래와 같은 조건을 충족해야한다. 1)모든 노드는 유일한 키를 갖는다. 2)왼쪽 서브 트리 키들은 루트 키보다 작다. 3)오른쪽 서브 트리 키들은 루트 키보
freakingeniousshawn.tistory.com
BST(이진탐색트리)는 큰 문제점이 있다. 바로 트리가 치우친 모양,바로 한쪽으로 노드가 쏠린 형태가 될 수가 있다. 한 쪽으로 지나치게 치우친 트리는 가장 효율적인 탐색 트리를 추구하는 자료구조의 궁극적 목표와는 먼, 매우 비효율적인 형태이다. 이를 방지하기 위해서는 균형잡힌 모양의 트리가 가장 이상적인데, 이러한 트리를 우리는 Balanced binary tree라고 한다.
Balanced binary tree의 구조를 가지기 위해서 쓰이는 유용한 자료구조가 바로 AVL tree다.
AVL tree는 몇가지 특징이 있는데, 아래와 같다.
1. 이진 탐색 트리의 속성을 가진다.
2. 왼쪽, 오른쪽 서브 트리의 높이 차이가 최대 1이다.
3. 높이 차이가 1보다 커지면 회전(rotation)을 통해 균형을 맞춰 높이 차이를 줄인다.
4. 삽입, 검색, 삭제의 시간 복잡도가 O(log n)이다.
군형이 무너진 트리는 크게 LL,RR,LR,RL의 경우로,
LL(left left)일때는 우회전 적용, RR(right right)일때는 좌회전 적용, LR(left right)일때는 LL의 형태로 만들고 LL해법으로 풀고 RL(right left)일때는 LR과 같은 메커니즘이지만 반대방향으로 해결하면 된다.
AVL Tree를 더 전문적으로 알아보고 싶다면 아래 링크들을 참고하자.
https://www.geeksforgeeks.org/avl-tree-set-1-insertion/
AVL Tree | Set 1 (Insertion) - GeeksforGeeks
AVL tree is a self-balancing Binary Search Tree (BST) where the difference between heights of left and right subtrees cannot be more than one for all nodes
www.geeksforgeeks.org
https://www.geeksforgeeks.org/avl-tree-set-2-deletion/
AVL Tree | Set 2 (Deletion) - GeeksforGeeks
We have discussed AVL insertion in the previous post. In this post, we will follow a similar approach for deletion. Steps to follow for deletion.
www.geeksforgeeks.org
2. AVL tree 코딩
앞서 AVL tree에 대해 열심히 설명했으니 직접 프로그래밍 해보자.
Rank 구현

AVL tree 구현







3. Leet code 110번 문제 풀이
문제 원본 링크:
https://leetcode.com/problems/balanced-binary-tree/
Balanced Binary Tree - LeetCode
Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.
leetcode.com
문제 설명:
이 문제의 요점을 간단하게 말하면, 해당 트리가 Balanced Binary tree 인지 그냥 Binary Tree 인지 검사하는 문제이다.
검사하려는 해당 트리의 모든 노드들은 Balanced Binary tree 여야 하니까 차례대로 내려가면서 검사하면 된다.
isBalanced()로 해당 노드가 Balanced Binary tree 인지 판별하고, height()에서 노드 깊이 구하고, 이를 비교해서 Left로 보낼지 Right로 보낼지 결정한다.
위 의견들을 종합해서 구현하면 아래 코드와 같다.

'C++를 이용한 자료구조' 카테고리의 다른 글
DFS(Depth-First Search)와 BFS(Breadth-First Search)을 이용한 그래프 탐색 (0) | 2022.11.05 |
---|---|
수중 쓰레기를 해결하는 자료구조-(중간) (0) | 2022.10.16 |
이진탐색트리(BST) +(LeetCode 98, 99, 700, 701 풀이) (0) | 2022.09.25 |
대체 우선순위 큐(Priority Queue),힙(Heap)이 뭔데? +(백준 1966번 풀이) (0) | 2022.09.17 |
현시점의 교육의 평등 - 전염병 사태와의 관련성을 중심으로 (0) | 2022.09.14 |