https://www.hackerrank.com/challenges/binary-search-tree-1/problem?isFullScreen=true
코드설명
CASE WHEN + NOT IN + NULL 을 활용합니다.
처음에 CONNECT BY를 활용해서 재귀적으로 파고든뒤 처리해야하나? 싶었습니다만 조건을 단순화시켜서 훨씬 쉽게 해결할 수 있었습니다.
아래 코드에서 중요점은, 이 부분입니다.
WHEN N NOT IN (SELECT DISTINCT P FROM BST WHERE P IS NOT NULL) THEN 'Leaf'
무엇이 중요할까요? 바로 P IS NOT NULL 부분입니다.
먼저 아래와 같이 서브쿼리가 수행된다면
SELECT DISTINCT P FROM BST;
NULL
6
13
11
2
4
15
9
이와 같은 결과가 나옵니다.
그러면 서브쿼리의 결과가 N에 NOT IN 되었는지 연산이 시작되는데, 이때 NULL값이 포함되어있으므로 NULL과 연산이 시작될 경우 비교자체가 UNKNOWN, NULL 값으로 표현되며 결국은 항상 TRUE는 절대 아니므로 FALSE가 반환될 것 입니다. 그러므로 서브쿼리의 결과로 NULL값을 피하기 위해 P IS NOT NULL 조건을 통하여 올바르게 조건을 비교하도록 해야합니다.
ORACLE 코드
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 AS NODETYPE
FROM BST
ORDER BY N ASC;