본문 바로가기
알고리즘(C언어)/알고리즘 및 실습 강의

(10)실습7주차_AVL트리_Bh의 정의,4가지회전,Bh계산,트리회전메소드[문제2]_1

by 코잼민 2024. 9. 15.

[문제2]의 PDF는 해당 링크로 이동하면 됩니다.

https://kojammin.tistory.com/64

 

(14)[Chapter6]AVL 트리_삽입 메소드

##중요한 핵심 부분:삽입 메소드 구현 코드 분석 :main에서 AVL트리 조립하는 방법##복습해야 될 부분 : AVL삽입메소드와 Rebalance메소드를 void반환형으로 스스로 다시 작성해보기##전체 코드123456789101

kojammin.tistory.com

## 알아야 할 개념 (요약) :

  • Bh의 정의 :
  • LL,RR ,LR,RL회전 메소드
  • 해당 노드에 대하여, Bh값 계산 반환 메소드

1_ Bh의 정의와 4가지 회전 메소드 원리, 코드 노트 정리 :

2_ 해당 노드에 대한 Height(높이)계산 메소드 노트 이론 :

이건 스스로 연습해보자

3_ 해당 노드에 대하여 BH를 계산해주는 메소드 노트 :

 

 

##요약_

  • 해당 노드의 Height : Left의 Height vs Right의 Height 중 큰값의 +1

빈노드(NULL) Height = 0

단말노드(차수 : 0)의 Height = 1

  • 해당 노드의 Bh : Height(Left) - Height(Right)

빈노드(NULL)Bh = 0

단말노드(차수 : 0)의 Bh = 0 //Left_Height = 0 - Right_Height =0 == 0

##코드 :

 

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
//회전 메소드
 
BNode* LL(BNode* L1) 
{
    BNode* L2 = L1->Left;
    L1->Left = L2->Right;
    L2->Right = L1;
    return L2;
}
 
BNode* RR(BNode* R1) 
{
    BNode* R2 = R1->Right;
    R1->Right = R2->Left;
    R2->Left = R1;
    return R2;
}
 
BNode* LR(BNode* L1) 
{
    BNode* L2 = L1->Left;
    L1->Left = RR(L2);
    return LL(L1);
}
 
BNode* RL(BNode* R1) 
{
    BNode* R2 = R1->Right;
 
    R1->Right = LL(R2);
 
    return RR(R1);
}
 
int GetHeight(BNode* p) 
{
    //1_ 임시변수 height를 0으로 초기화
    int height = 0;
 
    //2_ Case1_ 빈자리일 때, => height 0
    if (p == NULL) {
        return height;
    }
    //3_ Case2_ 빈자리가 아닐 때, 
    //L,R 재귀호출
    int L = GetHeight(p->Left);
    int R = GetHeight(p->Right);
    //둘 중 큰값 + 1;
    return ((L > R) ? L : R) + 1;
}
 
int GetBh(BNode* p) {
    //1_빈자리일 때,
    if (p == NULLreturn 0;
    //2_ 빈자리가 아닐 때,
    return GetHeight(p->Left) - GetHeight(p->Right);
}
cs