HackerRank中MySQL代码逻辑正确却被判错误?(二叉树节点问题)
问题分析与修复
错误原因
- 逻辑顺序颠倒:你先判断
N是否在P列中,这会导致根节点误判:如果根节点没有子节点,它的N不会出现在P列,会被错误归类为Leaf;正确逻辑应该优先通过P是否为null识别根节点,这是根节点的唯一特征,不受是否有子节点影响。 - 未指定列别名:HackerRank题目要求输出列有固定名称,你的查询没有给case表达式设置别名,导致输出的列标题是整个case语句的文本,不符合题目格式要求。
修正后的代码
如果题目要求输出两列(节点值和类型):
SELECT N, CASE WHEN P IS NULL THEN 'Root' WHEN N IN (SELECT P FROM BST) THEN 'Inner' ELSE 'Leaf' END AS `Node Type` FROM BST ORDER BY N;
如果题目要求将节点值和类型合并为一列(和你原代码思路一致):
SELECT CASE WHEN P IS NULL THEN CONCAT(N, ' Root') WHEN N IN (SELECT P FROM BST) THEN CONCAT(N, ' Inner') ELSE CONCAT(N, ' Leaf') END AS `Result` FROM BST ORDER BY N;
逻辑说明
- 优先判断
P IS NULL:直接标记为Root,这是根节点的唯一标识,无论它有没有子节点。 - 接着判断
N是否存在于P列:说明该节点有子节点,标记为Inner。 - 剩余节点既不是根节点也没有子节点,标记为Leaf。
内容的提问来源于stack exchange,提问作者Adarsh vijayvargiya
相关产品推荐
相关产品推荐

