SQL,力扣题目608,树节点

一、力扣链接

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'

上一篇:基于Retinex算法的图像去雾matlab仿真


下一篇:基于布局的3D场景生成技术:SceneCraft