力扣608(MySQL)-树节点(中等)

发布时间 2023-04-02 09:32:09作者: 我不想一直当菜鸟

题目:

给定一个表 tree,id 是树节点的编号, p_id 是它父节点的 id 。

 

树中每个节点属于以下三种类型之一:

叶子:如果这个节点没有任何孩子节点。
根:如果这个节点是整棵树的根,即没有父节点。
内部节点:如果这个节点既不是叶子节点也不是根节点。

写一个查询语句,输出所有节点的编号和节点的类型,并将结果按照节点编号排序。上面样例的结果为:

 

解释

节点 '1' 是根节点,因为它的父节点是 NULL ,同时它有孩子节点 '2' 和 '3' 。
节点 '2' 是内部节点,因为它有父节点 '1' ,也有孩子节点 '4' 和 '5' 。
节点 '3', '4' 和 '5' 都是叶子节点,因为它们都有父节点同时没有孩子节点。
样例中树的形态如下

 注意

如果树中只有一个节点,你只需要输出它的根属性。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/tree-node
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

方法一:使用CASE...WHEN....

先判断如果p_id为null就为根节点,如果id在p_id里面的话就是内部结点,其他都是叶子结点。

 1 # Write your MySQL query statement below
 2 select id,
 3 case
 4     when p_id is null then 'Root'
 5     when id in(
 6        select p_id
 7        from tree
 8     ) then 'Inner'
 9     else 'Leaf'
10 end AS type
11 from tree;

方法二:IF

1 select id,
2    if(isnull(p_id),'Root',
3       if(
4         id in (select p_id from tree),'Inner','Leaf') )as Type  
5 from tree 

小知识:

①case ... when...语法

情况一:

case
when 条件1 then 要显示的值1或语句1
when 条件2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end

情况二:

case 要判断的字段或表达式
when 常量1 then 要显示的值1或语句1
when 常量2 then 要显示的值2或语句2
...
else 要显示的值n或语句n
end

举例:

1 SELECT `店号`,`商品编码`,`销售数量`,
2 CASE 
3    WHEN `销售数量` > 250 THEN ''
4      WHEN `销售数量` > 150 THEN ''
5      WHEN `销售数量` > 100 THEN ''
6      ELSE ''
7    END AS 评级
8  FROM `销售表`;

②if语法:

if(表达式成立,返回值,否则返回值)
-- 如果销售数量> 100的就为优秀,否则为一般
SELECT *,IF(`销售数量` > 200,'优秀','一般') AS 评价 FROM `销售表`;