问题描述
我正在研究HackerRank练习-Binary Tree Nodes。
表BST包含两列:N和P,其中N表示二叉树中节点的值,P是N的父级。
它询问:
编写查询以查找按节点值排序的二叉树的节点类型。为每个节点输出以下内容之一:
Root: If node is root node.
Leaf: If node is leaf node.
Inner: If node is neither root nor leaf node.
以下查询有效:
SELECT CASE
WHEN P IS NULL THEN CONCAT(N,' Root')
WHEN N IN (SELECT DISTINCT P FROM BST) THEN CONCAT(N,' Inner')
ELSE CONCAT(N,' Leaf')
END
FROM BST
ORDER BY N;
但是,如果我稍微反转一下查询以获取Leaf节点类型1st,则它将不再起作用。有什么想法吗?谢谢。
SELECT CASE
WHEN P IS NULL THEN CONCAT(N,' Root')
WHEN N NOT IN (SELECT DISTINCT P FROM BST) THEN CONCAT(N,' Leaf')
ELSE CONCAT(N,' Inner')
END
FROM BST
ORDER BY N;
解决方法
更改
NOT IN (SELECT DISTINCT P FROM BST) --distinct is not needed there
收件人
NOT IN (SELECT P FROM BST WHERE P IS NOT NULL) --you had null values in column p
总而言之,您的代码无法正常工作,因为如果NOT IN
与包含NULL
的列表匹配,则不会返回任何记录