Algorithm/MySQL
[해커랭크(HackerRank)] Binary Tree Nodes (MySQL)
yujin.me
2021. 7. 8. 17:19
문제
- 2진 트리 문제. N은 이진 트리의 노드 값, P는 N의 상위 항목
- Root → 최상위 노드인 경우, 부모가 없는 노드 → 5가 최상위 노드
- Leaf → 최하위 노드인 경우, 자식이 없음 → 1, 3, 6, 9 → n이 p의 범위에 포함되지 않는 것들
- Inner → root도 leaf도 아닌 경우 → 2, 8
- 각 조건에 해당하는 노드 출력
코드
1. subquery
SELECT N, CASE WHEN P IS NULL THEN 'Root'
WHEN N NOT IN (SElECT Distinct P FROM bst WHERE P IS NOT NULL) THEN 'Leaf'
ELSE 'Inner' END
FROM BST
ORDER BY N
- 각 node에 대해서 parent의 case 따라 node type이 결정
- parent is null 일 경우 Root
- parent 리스트 안에 N이 없을 경우 Leaf
- 나머지 Inner
2. join
select distinct a.n
, case when a.p is null then 'Root'
when b.p is null then 'Leaf'
else 'Inner' end
from bst a
left join bst b
on a.n = b.p
order by a.n
- n이 p에 포함되지 않을 때 leaf가 되는데 그걸 검사하기 위해서는 left join이 필요하다.
- 조건에 만족하지 않을 때 포함되지 않을 때 null이 표시 되기 때문에 그걸 이용해 leaf를 출력할 수 있을 것 같았다.
- 처음에 inner join을 해봤으나 불가능했음
- left join을 했을 때 a.n이 b.p에 포함되지 않으면 null이 출력된다
- 그렇다면 a.p가 null일 때 root가 되고 b.n이 null이면 left 그 나머지일 때는 Inner가 된다
출처
Binary Tree Nodes | HackerRank
Write a query to find the node type of BST ordered by the value of the node.
www.hackerrank.com
반응형