본문 바로가기

알고리즘/Baekjoon

트리. [1086]

[1. 문제 설명]

https://www.acmicpc.net/problem/1068


[2. 풀이 접근]

leaf node 는 자식 노드가 없는 노드이므로,

문제에서 요구한 대로, tree 에서 노드를 제거 한 뒤,

자식 노드가 없는 노드의 개수를 세면 된다.

 

다음은 tree 에서 노드를 제거하는 방법이다.

아래 그림에서 a 노드를 제거해야 할 때, a 와 연결된 그 자식 노드만 제거한다면 (그 연결을 끊는다면),

d, e 노드가 제거되지 않는다.

즉, 제거할 노드를 root 로 하는 서브 트리를 전체 tree 에서 제거해야 한다.

tree 는 재귀적인 성질을 갖고 있으므로,

이 sub tree 역시 재귀적인 방법으로 제거하면 된다.

 

다음은 제거할 노드와 그 부모노드간의 연결성이다.

아래 그림에서 a 노드를 제거하였을 때, 별도 처리를 하지 않으면

root 는 제거된 노드 a 와 연결되어 있다.

즉, leaf node 개수를 제대로 세지 못하는 상태가 되는 것이다.

그래서 a 의 부모 노드에 접근해서 부모 노드와 a 노드 간 연결성을 제거해야 한다.

 

끝으로 구현 상 실수할만 한 부분이다.

트리에서 제거된 노드는 자식 노드가 없으므로, 자식 노드 개수가 0 이다.

그런데 트리에서 제거된 노드의 자식 노드 개수가 0 인 것과,

leaf node 가 되서 자식 노드 개수가 0이 된 것을 구분할 방법이 없다.

이 경우 노드의 제거 유무를 저장 할 추가 배열을 할당하여 해결하도록 한다.

(golang 으로 작성했으면, nil 을 사용해서 간단히 처리할 수 있었는데... 이 부분이 아쉽다.)


[3. 코드]

 

 

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

BFS. [14502]  (0) 2022.12.20
이진트리. [9934]  (0) 2022.12.15
큐. [2161]  (0) 2022.12.13
스택. [1406]  (0) 2022.12.12
부분 합. [2167]  (0) 2022.12.11