谁能解释一下这个黑客等级二叉树节点的解决方案?

Posted

技术标签:

【中文标题】谁能解释一下这个黑客等级二叉树节点的解决方案?【英文标题】:Can anyone please explain this solution of hacker rank Binary Tree Nodes? 【发布时间】:2021-04-21 21:10:24 【问题描述】:
SELECT N, CASE WHEN P IS NULL THEN 'Root' 
WHEN(SELECT COUNT(*) FROM BST WHERE P = b.N) > 0 THEN 'Inner'
ELSE 'Leaf'
END
FROM bst b 
ORDER BY N;`

为什么有p=b.n 以及为什么当我使用from bstp=bst.n 而不是from bst bp=b.n 时它不起作用?

【问题讨论】:

因为你已经为bst 设置了一个别名b 所以你必须使用b 作为这个表名 【参考方案1】:

SQL 预言机:-

select n,(case when P is null then 'Root'
when N not in(select nvl(p,0) from bst) then 'Leaf'
else 'Inner' end) from bst order by n;

【讨论】:

【参考方案2】:

在hackerrank上,如果有帮助,你可以试试这个:

select n,
case 
when p is null then 'Root'
when n in (select distinct(p) from bst) then 'Inner'
else 'Leaf'
end
from bst
order by n;

【讨论】:

【参考方案3】:

获取根节点P列的值为空。对于获取内部列,P 列值将是那些不为空但它们可能出现多次的列值,因此在列值上不同以获取这些值,最后其余所有节点然后将是叶节点。

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 
FROM BST 
ORDER BY N;

【讨论】:

请在您的答案中添加一些解释,以便其他人可以从中学习 获取根节点P列值为空。对于获取内部列,P 列值将是那些不为空但它们可能会出现多次的列值,因此在列值上不同以获取这些值并最终其余所有节点然后将是叶节点。 请通过编辑将所有解释添加到您的答案中【参考方案4】:

编写此代码的最佳方法是限定所有列引用。所以我会推荐:

SELECT b.N,
       (CASE WHEN b.P IS NULL
             THEN 'Root' 
             WHEN (SELECT COUNT(*) FROM BST b2 WHERE b2.P = b.N) > 0 
             THEN 'Inner'
             ELSE 'Leaf'
        END)
FROM bst b 
ORDER BY N;

这清楚地表明内部查询是一个相关子查询,它计算BST中的节点具有给定节点但不作为父节点的次数。

条件是什么?从逻辑上讲,它们是:

CASE WHEN <there is no parent>
     WHEN <at least one node has this node as a parent>
     ELSE <not a parent and no nodes have this as a parent>
END

请注意,我强烈不鼓励在相关子查询中使用 COUNT(*) 来确定是否存在任何匹配项。从性能和清晰度的角度来看,使用EXISTS 会更好:

SELECT b.N,
       (CASE WHEN b.P IS NULL
             THEN 'Root' 
             WHEN EXISTS (SELECT 1 FROM BST b2 WHERE b2.P = b.N) 
             THEN 'Inner'
             ELSE 'Leaf'
        END)
FROM bst b 
ORDER BY N;

【讨论】:

【参考方案5】:

您对bst 有两个查询。主查询和带有COUNT 的子查询。

子查询引用它自己的结果,并在它的WHERE 部分中引用主查询之一 (b.N)。

通过删除b 别名,您还可以删除从子查询中引用主查询的可能性。而p=bst.n 等于p=n,因为bst 指的是子查询的bst,而不是主查询。

【讨论】:

为什么我需要一个别名来引用子查询中的主查询? @SaifAlSohad 因为两个查询都查询bst 那么SELECT COUNT(*) FROM BST WHERE P = N 应该如何知道P 属于自己的查询,但N 属于它的主要查询,PNbst 的列,因此 N 在这种情况下也将引用子查询的列。

以上是关于谁能解释一下这个黑客等级二叉树节点的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

BFS解决二叉树的最小高度(2021-7-10)

寻找二叉树的下一个节点

二叉树性质及部分通俗解释

完全二叉树判断,简单而复杂

算法 - 平衡二叉树

#yyds干货盘点# 解决剑指offer: 判断是不是平衡二叉树