공부/알고리즘

LL 이진탐색트리

하이원 2020. 12. 10. 07:54

이진탐색트리

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
int bcnt;
struct Node {
    int data;
    
    //왼 : 나보다 작은값
    //오른 : 나보다 큰값
    Node *lch, *rch;    
    Node *alloc(int nd) {
        data = nd, lch = rch = NULL;
        return this;
    }
}buf[SIZE];
 
// 트리에서 data 검색
Node* searchNode(Node* now, int tg) {
    // 데이터 검색되면 리턴
    if (now == NULL || now->data == tg) return now;
    
    // 검색값을 찾으러 이동
    if (tg < now->data)    return searchNode(now->lch, tg);
    else return searchNode(now->rch, tg);
}
 
// 트리에 값 추가
Node* insertNode(Node* now, int nd) {
    // 넣을 위치를 찾으면 값을 넣음
    if (now == NULL)    return buf[bcnt++].alloc(nd);
    
    // 빈자리가 아니면 넣을 위치를 찾아서 이동
    if (nd < now->data)    now->lch = insertNode(now->lch, nd);
    else now->rch = insertNode(now->rch, nd);
    
    // 값을 넣는게 아니면 이동한 위치를 리턴
    return now;
}
 
// 노드 하위의 가장 작은값 찾기
int findMin(Node*p) {
    // 작은값은 무조건 왼쪽에 있으니까
    for (; p->lch; p = p->lch);
    return p->data;
}
 
// 노드 삭제
Node* eraseNode(Node* now, int tg) {
    // 지워야 할 노드 위치라면
    if (now->data == tg) {
        // 해당노드의 left, right가 다 있으면
        // right의 가장 작은 값을 찾아서 해당노드 위치로 이동하고
        // 가장 작은 값이 있던 위치를 삭제 (이진탐색 트리 성질)
        if (now->lch && now->rch) {
            int minValue = findMin(now->rch);
            now->data = minValue;
            now->rch = eraseNode(now->rch, minValue);
            return now;
        }
 
        // 한쪽만 있다면 있는쪽을 리턴
        if (now->lch) return now->lch;
        return now->rch;
    }
 
    // 지울 위치를 찾아 이동
    if (tg < now->data)    now->lch = eraseNode(now->lch, tg);
    else now->rch = eraseNode(now->rch, tg);
 
    // 지운게 아니라면 이동한 위치를 리턴
    return now;
}
 
// tree를 순회한 결과를 arr에 담는다.
int* ap, idx, cmd;
void traverse(Node* now) {
    if (now == NULLreturn;
    if (cmd == 4) ap[idx++= now->data;
    traverse(now->lch);
    if (cmd == 5) ap[idx++= now->data;
    traverse(now->rch);
    if (cmd == 6) ap[idx++= now->data;
}
cs

 

우선순위 큐

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
58
59
60
61
62
63
64
65
66
67
68
69
int n = 0;
int v[100010];
 
struct Heap
{
    void push(int value)    {
        n++;
        v[n] = value;
        update(n);
    }
    void update(int tg) {
        while (tg > 0)    {
            int parent = tg / 2;
            if (v[parent] > v[tg])    {
                int tmp = v[parent];
                v[parent] = v[tg];
                v[tg] = tmp;
                tg = parent;
            }
            else {
                break;
            }
        }
    }
    
    int pop()    {
        int ret = v[1];
        v[1= v[n];
        n--;
 
        downdate(1);
 
        return ret;
    }
    void downdate(int tg)    {
        while (tg <= n)    {
            int lch = tg * 2;
            int rch = lch + 1;
            int child = lch;
 
            if (rch <= n)    {    // 자식이 둘다 있음
                if (v[child] > v[rch])    child = rch;
            }
            else if (lch <= n)    {    // 자식이 왼쪽만 있음
                child = lch;
            }
            else {
                break;
            }
 
            if (v[tg] > v[child])    {
                int tmp = v[child];
                v[child] = v[tg];
                v[tg] = tmp;
                tg = child;
            }
            else {
                break;
            }
        }
    }
 
    void update_direct(int i, int value)
    {
        v[i] = value;
        update(i);
        downdate(i);
    }
};
cs

'공부 > 알고리즘' 카테고리의 다른 글

MongoDB 시간 groupby 쿼리  (0) 2024.04.04
DLL + heap  (0) 2021.02.19
정렬(sort) 관련  (0) 2020.12.09
부분합 문제  (0) 2020.12.07
기본 dfs, bfs  (0) 2020.12.01