문제

https://www.hackerrank.com/challenges/binary-search-tree-1/problem

 

Binary Tree Nodes | HackerRank

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

www.hackerrank.com

 

코드

SELECT DISTINCT BST.n,
    CASE
        WHEN BST.p IS NULL THEN 'Root'
        WHEN BST2.n IS NULL THEN 'Leaf'
        ELSE 'Inner'
    END
FROM BST
LEFT JOIN BST AS BST2 ON BST.n=BST 2.p
ORDER BY BST.n

 

설명

 

- BST 의 p 값이 null 이면 Root 을 출력하는데, 이는 CASE 문의 첫번째로 표현되었다.

- BST 의 Leaf 는 자신을 부모로 생각하는 값, 즉 n 값이 p 에 없는 노드이다.

  이는 LEFT JOIN 을 이용하여 풀었다.

  BST.n 과 BST2.p 가 같은 것을 조건으로 LEFT JOIN 을 걸면

  왼쪽(BST.n)의 값과 같은 오른쪽(BST2.p)값이 여러개가 매칭된 테이블이 나온다.

  LEFT JOIN 이기 때문에, n 값이 p 에 없으면 BST2의 n,p 값이 모두 null 로 찍힌다.

  따라서 CASE 문의 두번째로 표현할 수 있다.

- 그 외의 경우는 모두 Inner 이기 때문에 ELSE 로 표현하였다.

- 먼저 출력되는 BST.n 값에 distinct 를 걸면, 중복이 없는 BST.n 을 기준으로 (뒤의 출력되는) CASE 이 실행된다.

  이 사실을 몰랐더라면, 아마 나는 위의 쿼리 자체를 서브 쿼리로 만들어 select distinct 를 씌웠을 것 같다...

 

+ Recent posts