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;`
Run Code Online (Sandbox Code Playgroud)
谁能解释一下黑客等级二叉树节点的解决方案吗?为什么有以及为什么当我使用and而不是and时p=b.n它不起作用?from bstp=bst.nfrom bst bp=b.n
编写此代码的最佳方法是限定所有列引用。所以我建议:
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;
Run Code Online (Sandbox Code Playgroud)
这清楚地表明内部查询是一个相关子查询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
Run Code Online (Sandbox Code Playgroud)
请注意,我强烈建议不要使用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;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9809 次 |
| 最近记录: |