前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >SQL 二叉树节点

SQL 二叉树节点

作者头像
白日梦想家
发布2020-07-31 14:07:06
8820
发布2020-07-31 14:07:06
举报
文章被收录于专栏:SQL实现SQL实现

这是一道在 HackerRank 上的 SQL 竞赛题,题目叫做“Binary Tree Nodes”,它的难度等级属于中级。

题目描述

给定一张表 BST,其中包含两列:N 和 P,其中 N 表示二叉树中节点的值,P 是 N 的父级。

Column

Type

N

Integer

P

Integer

编写 SQL 以查找按节点值排序的二叉树的节点类型。每个节点只能属于以下类型中的一种:

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

「输入样例」

N

P

1

2

3

2

6

8

9

8

2

5

8

5

5

null

「输出结果」

代码语言:javascript
复制
1 Leaf
2 Inner
3 Leaf
5 Root
6 Leaf
8 Inner
9 Leaf

「说明」

下图是示例数据构成的二叉树:

解决方案

每个节点的类型只能属于 Root、Leaf、Inner 中的一种。Root 类型很好判断,如果一个节点没有父节点,那该节点就是根节点,对应的类型就是 Root。如果一个节点没有子节点,那么它就是叶子节点,即为 Leaf 类型。

除了 Root 和 Leaf 类型的节点,剩下的就是 Inner 类型的节点。该如何判断一个节点是不是 Inner 类型呢?

能不能通过“存在子节点”这个条件判断呢?不能!因为根节点也有子节点。

那通过“存在父节点”这个条件判断呢?也不能!因为叶子节点存在父节点。

显然,这两个条件的范围都太大了,我们适当加入一些限制条件就可以用来判断是不是 Inner 类型的节点了。“存在子节点且不为根节点”和“存在父节点且不为叶子节点”都可以用来作为判断节点是 Inner 类型的条件。

具体的 SQL(MySQL) 实现如下:

代码语言:javascript
复制
SELECT
  N,
  IF(
    P IS NULL,
    'Root',
    IF (
      (SELECT
        COUNT(*)
      FROM
        BST
      WHERE P = a.N) = 0,
      'Leaf',
      'Inner'
    )
  )
FROM
  BST a
ORDER BY N
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL实现 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解决方案
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档