首页 > 其他分享 >力扣608.树节点练习

力扣608.树节点练习

时间:2024-10-19 14:48:58浏览次数:3  
标签:t1 Tree 608 节点 力扣 null id select


力扣608.树节点

一、题目总结

如果你代码出错,可能是以下问题
1、not in使用出现问题 :not in后面接select子查询的结果中不能出现空值,需要像我这样where id not in (select ifnull(p_id, ‘ad’) as id from Tree tr2) ,使用ifnull将空值转化为其他值,才能正常进行判断,但是 如果是 in的话就不需要这样。
在这里扩充总结:
①NULL值不能用用来(1)±*/, (2) 不能用来<>, (3) 不能用来 not in否则返回空或NULL,即 不可以 not in (select null),返回空
②not like 会把null值排除掉。
③not exists 如果条件中有null值, 外层查询的null值会被返回。
④ in 和 exists 均会过滤掉条件中null值

2、CTE表达式没有给重名的列起别名问题:CTE表达式中临时表如果你写的时候还没有使用cte表达式,也就是写进with t1 as () 中是可以查询成功的,但是如果临时表中存在列名重复的列,在主查询中系统无法分别你要使用的是哪一列,所以需要多走一步,把 cte中的select *认真写完,给要用的列分别起别名
总结:使用CTE表达式如果在子表中使用了类似join连接或者其他操作等,要注意是否有同名列,如果有给列取别名让系统区分它们

二、608题目描述和建表语句

表:Tree

±------------±-----+
| Column Name | Type |
±------------±-----+
| id | int |
| p_id | int |
±------------±-----+
id 是该表中具有唯一值的列。
该表的每行包含树中节点的 id 及其父节点的 id 信息。
给定的结构总是一个有效的树。

树中的每个节点可以是以下三种类型之一:

“Leaf”:节点是叶子节点。
“Root”:节点是树的根节点。
“lnner”:节点既不是叶子节点也不是根节点。
编写一个解决方案来报告树中每个节点的类型。

以 任意顺序 返回结果表。

结果格式如下所示。

示例 1:
在这里插入图片描述

输入:
Tree table:
±—±-----+
| id | p_id |
±—±-----+
| 1 | null |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
±—±-----+
输出:
±—±------+
| id | type |
±—±------+
| 1 | Root |
| 2 | Inner |
| 3 | Leaf |
| 4 | Leaf |
| 5 | Leaf |
±—±------+
解释:
节点 1 是根节点,因为它的父节点为空,并且它有子节点 2 和 3。
节点 2 是一个内部节点,因为它有父节点 1 和子节点 4 和 5。
节点 3、4 和 5 是叶子节点,因为它们有父节点而没有子节点。

示例 2:

输入:
Tree table:
±—±-----+
| id | p_id |
±—±-----+
| 1 | null |
±—±-----+
输出:
±—±------+
| id | type |
±—±------+
| 1 | Root |
±—±------+
解释:如果树中只有一个节点,则只需要输出其根属性。

注意:本题与 3054. 二叉树节点 一致。

建表语句

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');

四、方案一和解题思路

思路解析
首先明确题目要求,输出type的值有多种,毫无疑问适合用case when分多种情况进行判断,然后输出相对应的值。
第一个父节点:很好实现,只要Tree表中的p_id为null值的id就是父节点

select id from Tree where p_id is null;

运行结果:

第二个内部节点:
内部节点要求理解过来就是在id和p_id中都存在的数字即为内部节点id,思路是使用左连接 left join 同样的表,将连接条件设置为表1的id等于表2的p_id,如果四列都有值且不为空,那么就是内部节点Inner,实现代码如下

select distinct t1.id
                       from Tree t1
                                left join Tree t2
                                          on t1.id = t2.p_id
                       where t1.p_id is not null
                         and t2.p_id is not null;

运行结果

第三个叶子节点
可以理解为只有id中存在而p_id中不存在的数字即为叶子结点的ID,因为叶子节点不是任何节点的父节点。可以使用where 子查询加not in将id在p_id中存在的值剔除。
但是要注意!!! not in 后面中不能存在null值,会导致查询不出结果,而in可以有null值,所以需要使用ifnull()函数将null值转化为其他值,我转化为了字符串,具体实现代码如下

select id
from Tree
where id not in (select ifnull(p_id, 'ad') as id from Tree);

运行结果
在这里插入图片描述

最后使用case when嵌套这三种情况输出,最终代码如下

select id,
       case
           when p_id is null then 'Root'
           when id in (select distinct t1.id
                       from Tree t1
                                left join Tree t2
                                          on t1.id = t2.p_id
                       where t1.p_id is not null
                         and t2.p_id is not null) then 'Inner'
           when id in (select id
                       from Tree tr1
                       where id not in (select ifnull(p_id, 'ad') as id from Tree tr2)
           ) then 'Leaf'
           end as type
from Tree;

运行结果
在这里插入图片描述

三、方案二和思路

思路解析
方案二思路简单,但是代码略显臃肿,所以可以考虑使用cte表达式,创建一个连接的表供引用,方便使用,这样在case when 的时候就可以简化代码
但是要注意:cte表达式中,如果有多个列的列名相同,即使你在表达式里面select * 能查询,但是在主查询会引用不了这些列名相同的列,所以,需要在cte表达式中给列明相同的列起一个别名,才能在主查询中引用。
cte临时表代码,左连接同一个表

select t1.id   as t1id,
       t1.p_id as t1pid,
       t2.id   as t2id,
       t2.p_id as t2pid
from Tree t1
         left join Tree t2
                   on t1.id = t2.p_id;

结果如下
在这里插入图片描述
然后使用case when也很好判断了,t1id为空值的就为父节点,四个列值都不为空的就为内部节点,t2id或者t2pid为空的就为叶子节点。实现代码如下

with t1 as (select t1.id   as t1id,
                   t1.p_id as t1pid,
                   t2.id   as t2id,
                   t2.p_id as t2pid
            from Tree t1
                     left join Tree t2
                               on t1.id = t2.p_id)
select distinct t1id    as id,
                case
                    when t1pid is null then 'Root'
                    when t1pid is not null and t2id is not null then 'Inner'
                    else 'Leaf'
                    end as type
from t1;

结果如图
在这里插入图片描述

标签:t1,Tree,608,节点,力扣,null,id,select
From: https://blog.csdn.net/m0_45220893/article/details/142964141

相关文章

  • 137,[复杂递归+时间日期]SQL训练之,力扣,1384. 按年度列出销售总额
    学习:知识的初次邂逅复习:知识的温故知新练习:知识的实践应用目录一,原题力扣链接二,题干三,建表语句四,分析五,SQL解答六,验证七,知识点总结一,原题力扣链接.-力扣(LeetCode)二,题干Product 表:+---------------+---------+|ColumnName|Type|+------------......
  • Springboot的洗衣店预约APP的设计与实现-附源码260839
    摘 要随着现在网络的快速发展,网络的应用在各行各业当中它很快融入到了许多学校的眼球之中,他们利用网络来做这个洗衣店预约的网站,随之就产生了“洗衣店预约系统”,这样就让用户洗衣店预约系统更加方便简单。对于本洗衣店预约系统的设计来说,它主要是采用后台采用java语言、s......
  • 基于springboot建筑造价师资格考试应试网站-附源码260839
    摘 要如何合理确定和有效控制工程投资,是工程项目建设的一大难题,如何使建筑工程造价管理与社会生产水平相适应,是建筑工程造价管理中需要解决的问题,只有加强建筑工程造价管理工作力度,提高建筑工程造价人员素质,才能使建筑工程造价管理走上国际化的道路。本文根据我国工程造价......
  • 【leetcode】 码住—两种办法解决力扣数学思想 “加一” 操作
     前言......
  • 代码随想录算法训练营day19| 235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插
    学习资料:https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html****学习记录:235.二叉搜索树的最近公共祖先(加一个函数traversal)点击查看代码#Definitionforabinarytreenode.#classTreeNode(object):#def__init__(self,x):#self.val=x......
  • ComfyUI 节点、插件的基本指南(附整合包)
    ComfyUI是一个多功能的StableDiffusion图像/视频生成工具,能够让开发者设计并实现自定义节点,扩展功能。如果你有特定的任务想实现并需要创建一个自定义节点,本指南会带你一步步完成ComfyUI自定义节点的创建过程。开始前的准备在开始创建自定义节点之前,确保你有必要的工......
  • 力扣面试题02.07.链表相交
    题目链接:面试题02.07.链表相交-力扣(LeetCode)给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果......
  • 力扣142.环形链表II
    题目链接:142.环形链表II-力扣(LeetCode)给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,评测系统内部使用整数 pos 来表示......
  • 力扣242.有效的字母异位词
    题目链接:242.有效的字母异位词-力扣(LeetCode)给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词。示例 1:输入:s="anagram",t="nagaram"输出:true示例2:输入:s="rat",t="car"输出:false提示:1<=s.length,t.length<=......
  • 力扣349.两个数组的交集
    题目链接:349.两个数组的交集-力扣(LeetCode)给定两个数组 nums1 和 nums2 ,返回 它们的 交集。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。示例1:输入:nums1=[1,2,2,1],nums2=[2,2]输出:[2]示例2:输入:nums1=[4,9,5],nums2=[......