KEEP GOING

[MySQL] HackerRank : Binary Tree Nodes Solution 본문

code review/sql

[MySQL] HackerRank : Binary Tree Nodes Solution

jmHan 2021. 12. 21. 18:25
반응형

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

 

1. 틀린 코드 

SELECT N
       ,(CASE WHEN P IS NULL THEN 'Root', # 문제1 다중 조건 처리시 ',' 사용 안함 
              WHEN N IN (SELECT P FROM BST) THEN 'Inner'
              ELSE 'Leaf' 
         )END AS 'NAME' # 문제2 END 처리 후 소괄호 처리해야 함
FROM BST
ORDER BY N ASC

 

 

2. 정답인 코드 (서브쿼리 사용)

SELECT N
       ,(CASE WHEN P IS NULL THEN 'Root'
              WHEN N IN (SELECT P FROM BST) THEN 'Inner'
              ELSE 'Leaf' 
         END 
         )AS 'NAME'
FROM BST
ORDER BY N ASC

 

* 서브쿼리 사용시 

  WHEN N NOT IN (SELECT P FROM BST) THEN 'Leaf'

  처리시 리프 노드에 Leaf 처리가 되지 않는 이유?

 

  N이 리프노드가 되기 위해서는 2,5,8, Null (루트노드인 5의 부모가 Null 이므로)에 대해 모두 True를 반환해야 한다. 예를 들어 N이 1이라면 1!=2 1!=5 1!=8은 True 값을 반환한다. 하지만 1!=Null 의 경우 True도 False도 아닌 Unknown 값을 반환한다. 띠라서 P의 모든 값에 대해 True를 만족하지 못하므로 'Leaf' 값을 가지지 못하게 된다.    

  

 

3.  정답인 코드 (LEFT JOIN 사용)

SELECT DISTINCT BST1.N
       ,(CASE WHEN BST1.P IS NULL THEN 'Root'
              WHEN BST2.N IS NULL THEN 'Leaf'
              ELSE 'Inner' 
         END)AS 'NAME'
FROM BST AS BST1
LEFT JOIN BST AS BST2 ON BST1.N = BST2.P
ORDER BY BST1.N
반응형
Comments