一、力扣链接
LeetCode_608
二、题目描述
表:Tree
+-------------+------+ | Column Name | Type | +-------------+------+ | id | int | | p_id | int | +-------------+------+ id 是该表中具有唯一值的列。 该表的每行包含树中节点的 id 及其父节点的 id 信息。 给定的结构总是一个有效的树。
树中的每个节点可以是以下三种类型之一:
- "Leaf":节点是叶子节点。
- "Root":节点是树的根节点。
- "lnner":节点既不是叶子节点也不是根节点。
编写一个解决方案来报告树中每个节点的类型。
三、目标拆解
四、建表语句
Create table If Not Exists Tree (id int, p_id int)
Truncate table Tree
insert into Tree (id, p_id) values ('1', NULL)
insert into Tree (id, p_id) values ('2', '1')
insert into Tree (id, p_id) values ('3', '1')
insert into Tree (id, p_id) values ('4', '2')
insert into Tree (id, p_id) values ('5', '2')
五、过程分析
1、根据题意可以采用递归的方法
六、代码实现
with recursive t1(id, type) as(
select id, cast('Root' as char(32)) as type
from tree where p_id is null
union all
select t.id,
case when t.id in (select p_id from tree)
then 'Inner'
else 'Leaf'
end as type
from tree t
join t1 on t.p_id = t1.id
)
select * from t1;
七、结果验证
八、小结
1、MySQL 使用递归时需要加上recursive 关键字
2、写递归时,临时表名后面需要在括号里写好参数,与select 后面的字段一一对应
3、初始化SQL 添加'Root' 类型,需要使用cast() 函数进行强制类型转换,不能直接写'Root'