二叉树节点sql hackerRank问题

问题描述 投票:0回答:1

我正在尝试解决以下 hackerrank 问题: 给定一个表 BST,包含两列:N 和 P,其中 N 表示二叉树中节点的值,P 是 N 的父节点。编写一个查询来查找按以下顺序排序的二叉树的节点类型节点的值。为每个节点输出以下内容之一: Root:如果节点是根节点。 Leaf:如果节点是叶节点。 内部:如果节点既不是根节点也不是叶节点。

如果我在第二种情况下使用“IN”运算符,我会得到输出,但如果我使用“NOT IN”,则不会得到输出 谁能告诉我为什么它不执行第二种情况

select n,
case
when p is null then "Root"
when N  IN (select p from bst) then "Inner"
else "Leaf"
end
from bst
order by n

case
when p is null then "Root"
when N NOT IN (select p from bst) then "Leaf"
else "Inner"
end
sql mysql binary-tree in-operator
1个回答
0
投票

我使用的是 Oracle DB,Oracle 使用 ANTI JOIN 表示 NOT IN。

但是 NOT IN 在语义上与 LEFT JOIN / IS NULL 和 NOT EXISTS 不同,因为它的逻辑是三价的,如果列表中存在 NULL 值,对其进行过滤将永远不会返回任何内容。 这就是为什么你没有得到输出。

相反,你可以用 EXISTS/NOT EXISTS 来解决它

选择N ,案件 当 p 为空时则“Root” 当不存在时(从 bst b 中选择 p,其中 b.p=a.n)则“叶子” 另有“内” 结尾 来自 bst a 按 n 排序;

© www.soinside.com 2019 - 2024. All rights reserved.