【SQL每日一练】查询二进制树节点

文章目录


题目

有一个表BST,其中包含两列:N和P,其中N表示二进制树中节点的值,P是N的父级。

编写一个查询,以查找按节点值排序的二进制树的节点类型。为每个节点输出以下内容之一:

root:如果节点是根节点。

Leaf:如果节点是叶节点。

Inner:如果节点既不是根节点也不是叶节点。

输入

输出

复制代码
1 Leaf
2 Inner
3 Leaf
5 Root
6 Leaf
8 Inner
9 Leaf

一、题析

根据上面题目可知

  1. P 是 null,那对应的N就是 Root
  2. 如果P和N中有对应的值,那 就是 Inner
  3. 否则(P和N没有值)就是 Leaf

二、题解

1.MySQL/SqlServer

代码如下:

c 复制代码
select DISTINCT a.N,
case when a.P is null then 'Root'
when b.P is null then 'Leaf' 
else 'Inner' end
from BST a left join  BST  b on a.N = b.P 
order by a.N

或者

复制代码
SELECT BST.N, CASE
	WHEN BST.P IS NULL THEN 'Root' 
	WHEN Parents.P IS NULL THEN 'Leaf'
	ELSE 'Inner' END
FROM BST
LEFT JOIN (SELECT DISTINCT P FROM BST ) Parents on Parents.P=BST.N
ORDER BY BST.N

2.Oracle

复制代码
with tmp as (
  select n, p, level as l
  from   bst
  connect by prior n = p
  start with p is null
)
select n, case when l = 1 then 'Root'
            when l = (select max(l) from tmp) then 'Leaf'
            else 'Inner'
       end output
from tmp
order by n;

相关推荐
Shorasul12 小时前
Redis怎样提取门店具体坐标_通过GEOPOS指令读取Geo内部经纬度信息
jvm·数据库·python
m0_3776182312 小时前
Redis怎样利用Lua为多个Key同步续期
jvm·数据库·python
2401_8326355812 小时前
如何使用宝塔面板配置高性能网站防火墙_启用WAF防御规则
jvm·数据库·python
数厘12 小时前
2.17 sql条件筛选(WHERE、比较运算符、逻辑运算符、BETWEEN、IN、LIKE模糊查询、IS NULL)
数据库·sql
DaqunChen12 小时前
如何查看对象在数据文件中的分布_DBA_EXTENTS与FILE_ID映射关系
jvm·数据库·python
2301_8035389512 小时前
golang如何实现备忘录模式_golang备忘录模式实现方案
jvm·数据库·python
qq_2069013912 小时前
如何授予DBA权限_GRANT DBA TO赋予超级管理员角色
jvm·数据库·python
2402_8548083712 小时前
Golang怎么实现分布式追踪采样_Golang如何设置采样率控制Trace数据的采集比例【技巧】
jvm·数据库·python
粉嘟小飞妹儿12 小时前
php怎么使用Ice RPC通信_php如何实现跨语言微服务远程调用
jvm·数据库·python
m0_3776182312 小时前
C#怎么实现批量邮件发送 C#如何用MailKit批量发送个性化邮件和HTML格式邮件【网络】
jvm·数据库·python