我正在解决hackerranks二叉树问题.PFB问题
您将获得一个表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 n,
case
when p is null then 'Root'
when p is not null and (n in (select p from BST)) then 'Inner' else 'Leaf'
end
from BST order by n
但在此之前,我正在尝试以下无效的查询
select n,
case
when p is null then 'Root'
when p is not null and (n in (select p from BST)) then 'Inner'
when p is not null and (n not in (select p from BST)) then 'Leaf'
end
from BST order by n
上面的查询给出了根音符和内部节点但是它没有叶子给出null,有人可以解释为什么它会显示这种行为。
您可以尝试问题here
三江源
答案 0 :(得分:4)
这是因为sql如何处理IN
和NOT IN
查询。
NOT IN
为列表中的每个元素计算!=
子句,列表(列p)包含NULL
值。因此,value!= NULL计算为UNKNOWN。
重复:NOT IN clause and NULL values
试试这个:
select n,
case
when p is null then 'Root'
when p is not null and (n in (select p from BST)) then 'Inner'
when p is not null and (n not in (select p from BST where p IS NOT null)) then 'Leaf'
end
from BST order by n
这应该给出预期的结果。
答案 1 :(得分:1)
以下是NULL
与not in
一起使用时行为的良好工作示例:
select
case
when NULL not in ('a','b') then 'not in'
when NULL in ('a','b') then 'in'
else 'What?'
end
这会返回What?
,这可能看起来很意外。
答案 2 :(得分:0)
学习将not exists
与子查询一起使用,而不是not in
。它具有正确的语义,因此您不太容易出错。
您可以将case
表达式编写为:
select n,
(case when p is null then 'Root'
when exists (select 1 from BST bst2 where bst2.p = bst.n)
then 'Inner'
else 'Leaf'
end)
from BST
order by n;
请注意,我还简化了case
表达式。您不需要重复这些条件,因为case
表达式按顺序进行评估。
答案 3 :(得分:0)
因此,您可以尝试尝试使用“ NOT NULL”和“ AND”代替。
选择N, B.p为NULL的情况下,则'Root' 当B.N IN(从BST中选择p),然后选择“内部” 否则“叶” 结束案例 从BST B到N;