[SQL Runday] HackerRank Binary Tree Nodes

Lana Chung·2022년 4월 5일
0

SQLRunday

목록 보기
2/16
post-thumbnail

이진 트리의 노드의 타입을 출력하기

  • 칼럼 N은 노드 이름, 칼럼 P는 노드의 부모 노드 (NULL은 없다는 뜻)
  • 자식이 없는 노드는 Leaf, 부모가 없는 노드는 Root, 둘 다 있는 노드는 Inner

Key Points

  • CASE-WHEN절 사용하여 조건별로 맞게 출력하기
  • 새로 배운 것 : SET, Group-Concat
    • 처음에 접근할 때, sub table로 distinct P만 구해서 IN절로 하면 됐는데 뭐에 쓰였는지
    • make list를 검색해서 Group-concat을 알아옴.
      SET @list = (select group_concat(distinct P) from BST);
      select * from bst where n in (@list);
      -- 혹은
      select group_concat(distinct p, seperator ',')
      from BST where p is not null
    • 이러면 string 형태로 '2,4,8' 문자열을 출력할 수 있다.
    • 여기서 hash해서 가져오려고 끙끙대다가, 그냥 subtable 만드는 방법으로 해결함..

Errors

  • when (P is null) then 'Root' 구문을 Inner 다음에 써주면 제대로 작동하지 않고, P가 Null인 N값에도 Inner가 출력된다. 왜지?
    - 우선 distinct P 테이블에 노드 15가 들어간다. 부모 노드니깐.
    • 그리고 N(15)가 Inner 기록된다.
    • 그다음 When절에서 P 값이 null이지만, 먼저 Inner로 출력되어서 그냥 Inner로 가져온다?
    • 다음에 활용할땐 기억해야 할 점! CASE 작성할 땐 WHEN 순서에 유의하자.
  • distinct P가져올때 P가 Null 값도 있으므로, where P is not null조건을 붙여주는 것이 중요하다. Null이 빠져야 제대로 동작한다.

select N, 
    case
        when (P is null) then 'Root'
        when(N in (select distinct P from BST
			where P is not null)) then 'Inner'
    else 'Leaf'
    end as case_result
from BST
order by N
profile
그게 쉬운 일이었다면, 아무런 즐거움도 얻을 수 없었을 것이다.

0개의 댓글