https://www.hackerrank.com/challenges/binary-search-tree-1/problem?isFullScreen=true

 

Binary Tree Nodes | HackerRank

Write a query to find the node type of BST ordered by the value of the node.

www.hackerrank.com

코드설명

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;

+ Recent posts