자료구조

[자료구조] 이진트리 연산

김천종 2022. 11. 11. 20:50
반응형

### getCount() ###

트리의 전체 노드 수를 반환하는 함수 

1
2
3
4
5
6
7
8
9
10
11
int getCount() { return isEmpty() ? 0 : getCount(root); }
    // 매개변수를 안넣어서 루트를 매개변수로 하는 함수 호출
 
    int getCount(BinaryNode* Node) {
        if (Node == NULLreturn 0;
        // 재귀적으로 함수를 호출하다가 NULL 까지 가면 0 반환
        else 
            return 1 + getCount(Node->getLeft())
                + getCount(Node->getright());
        // 반환되는 값에 1을 더함으로써 자기 자신의 개수를 추가함
    }
cs

 

 

### getHeight() ###

트리의 높이 ( 서브 트리의 높이 +1 ) 을 반환하는 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int getHeight() { return isEmpty() ? 0 : getHeight(root); }
    // 매개변수를 안넣어서 루트를 매개변수로 하는 함수 호출
 
    int getHeight(BinaryNode* Node) {
        if (Node == NULLreturn 0;
        // 재귀적으로 함수를 호출하다가 NULL까지 가면 0 반환
 
        int h_left = getHeight(Node->getLeft());
        // 왼쪽 서브트리의 높이 계산
 
        int h_right = getHeight(Node->getright());
        // 오른쪽 서브트리의 높이 계산
 
        return (h_left > h_right) ? h_left + 1 : h_right + 1;
        // 왼쪽 서브트리, 오른쪽 서브트리의 높이를 비교하며 
        // 1씩 증가시킴으로써 최종적으로 둘 중에 더 높은 서브트리의 
        // 높이를 반환한다.
    }
cs

 

 

### getLeafCount() ###

트리의 단말 노드 수를 반환하는 함수

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int getLeafCount() { return isEmpty() ? 0 : getLeafCount(root); }
    // 매개변수를 안넣어서 루트를 매개변수로 하는 함수 호출
 
    int getLeafCount(BinaryNode* Node) {
        if (Node == NULLreturn 0;
        // 재귀적으로 함수를 호출하다가 NULL까지 가면 0 반환
        // NULL을 가르키는 포인터를 가지고 있지만 단말노드는 아닌 상황에 쓰임
 
        if (Node->isLeaf()) return 1;
        // 재귀적으로 함수를 호출하다가 단말노드에서 1 반환
 
        else {
            return getLeafCount(Node->getLeft()) +
                getLeafCount(Node->getright());
            // 단말노드를 만나면 1을 반환하기 때문에 왼쪽 서브트리의 
            // 단말노드 개수 + 오른쪽 서브트리의 단말노드 개수를 하면
            // 전체 단말노드 개수를 반환할 수 있다. ( 1(자기자신)을 더하지 않아도 )
        }
    }
cs
반응형