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

Sai*_*had 4 mysql sql

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

Gor*_*off 7

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

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)