티스토리 뷰

카테고리 없음

Heap Java 코드

더블제로스톤 2016. 9. 23. 09:13

Heap

-최소값, 최대값을 구하는데 최적화된 자료구조

-완전 이진 트리로 구현하며 루트노드가 최소 또는 최대임

-배열과 연결리스트로 구현할 수 있음

-연결리스트의 경우 오른쪽 끝 노드를 접근하기 힘듦

-우선 순위 큐로 사용하기 적절함


Java 코드

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
public class Heap {
    ArrayList<Integer> tree; //배열을 이용한 트리
    int size; //현재 트리 사이즈
    
    public Heap(){
        tree = new ArrayList<>();
        tree.add(-1); //트리 시작을 1부터 하기 위함
        size = 0;
    }
    
    //새로운 숫자노드 추가
    public void insert(int num){
        size++//트리 사이즈 증가
        if(tree.size() == size) tree.add(num); //현재 트리 사이즈가 배열 사이즈와 같을때 add(): 배열 크기 늘어남
        else tree.set(size,  num); //현재 트리 사이즈가 배열 사이즈 보다 작을때 set(): 배열 크기 그대로
        int child = size;
        while(child/2 >= 1){
            if(tree.get(child) >= tree.get(child/2)) break//자식 보다 자기가 작거나 같을 경우 종료
            else//자식이 자기보다 작을 경우 바꾸기
                int temp = tree.get(child);
                tree.set(child, tree.get(child/2));
                tree.set(child/2, temp);
                child /= 2;
            }
        }
    }
    
    //루트 노트 반환후 트리 재정렬
    public int root(){
        if(size < 1return -1//트리 노드가 하나도 없을 경우
        int root = tree.get(1); //루트 노트 저장
        tree.set(1,  tree.get(size--)); //루트 노트에 최말단 노드 삽입 후 트리 사이즈 감소
        int parent = 1;
        int leftChild, rightChild, selectedChild; //왼쪽, 오른쪽, 최종 선택된 자식
        while(true){
            leftChild = parent*2;
            rightChild = parent*2 + 1;
            if(rightChild > size){ //오른쪽 자식이 없을 경우
                if(leftChild > size) break//왼쪽 자식도 없을 경우 종료
                selectedChild = leftChild; //왼쪽 자식이 있을 경우 선택
            } else//더 값이 작은 자식 선택
                if(tree.get(leftChild) <= tree.get(rightChild)) selectedChild = leftChild;
                else selectedChild = rightChild;
            }
            if(tree.get(parent) <= tree.get(selectedChild)) break//자기가 선택된 자식보다 값이 작거나 같은 경우 종료
            else//자식과 바꾸기
                int temp = tree.get(parent);
                tree.set(parent, tree.get(selectedChild));
                tree.set(selectedChild, temp); parent = selectedChild;
            }
        }
        return root;
    }
    
    //트리 출력
    public void printTree(){
        int index = 1//현재 배열 위치
        int level = 1//트리 레벨
        while(true){
            if(index > size) break;
            for(int i=index; i<Math.pow(2, level); i++){
                if(i > size) break;
                System.out.print(tree.get(i) + " ");
                index++;
            }
            level++;
            System.out.println();
        }
        System.out.println("======================");
    }
}
cs


댓글
최근에 올라온 글
최근에 달린 댓글
«   2025/02   »
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
Total
Today
Yesterday
글 보관함